coreutils5.0 comm.c源碼分析

coreutils5.0 comm.c源碼分析
很久沒有讀代碼了,雙12爲改善環境,網購了兩個樂哥支架,把顯示器弄得更人性化,於是又開始讀源碼。
這次,不太急了,因爲我知道源碼總是讀不完的,而且讀完源碼後,再幹什麼呢?好象也還是讀源碼,那爲什麼不把心思放在當下,好好的享受一下讀源碼的樂趣呢。
而且,我原來讀源碼時,總是要拷一些代碼出來,後來,發現意義不大,我要從宏觀上理解代碼,而一下拷出代碼,也是讓人陷到細節中,而讀代碼之初,更需要從宏觀上了解代碼的實現邏輯,爲些,我想,不要拷代碼,而且也不要太快的讀完代碼,也許讀完後,再回顧一下,品味一下。也許更好
今天再讀了comm.c這個程序。
這個程序的使用是要會的,我寫了兩個文件進行測試。
a.1
1
3
5
a.2內容
3
5
6
再進行測試
./comm a.1 a.2
./comm -1 a.1 a.2
./comm -2 a.1 a.2
./comm -3 a.1 a.2
弄清楚用法後。再看程序,用了三個變量
only_file_1,only_file_2,both
這三個變量,用於控制這一行是兩個文件共有的,還是某個文件獨有的。only_file_1=0表示不顯示文件1獨有的。
only_file_2=0表示不顯示文件2獨有的。
both=0表示不顯示兩個文件共有的。
在compare_file函數中進行文件的比較及打印操作,而在main中只是設置這三個標誌。
總體來講,comm程序在比較時,要求文件是已經排好順序的,因爲comm程序使用的是類似合併排序的技巧。
在數據結構一課中,講過。大體思路如下:
如要合併兩個數組
a=[1,3,5]
b=[3,5,6]
因爲兩個數組已經排好序了,因此設兩個指針指向數組。
pa=a
pb=b
while(pa && pb){
  if (pa<=pb) pa插入,後移
  否則 pb插入,後移
}
while(pa)
  pa插入,後移
while(pb)
  pb插入,後移
反正大概是這樣一個思路。

只不過,作者在比較兩行時,使用的方法比較繞,要我說,把兩行當成兩個字符串,直接用字串比較函數strcmp不行嗎?
反正看懂了,覺得漂亮,沒看懂呢,暈。我呢,側重於代碼要實現的功能。沒有細細的推敲。
最後函數writeline有些暈。
控制tab打印的程序有些暈。但總體程序已經有了把握,所有我就留個尾巴,等以後再看。
今天讀代碼時,讀出聲音來,發現能集中注意力。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章