coreutils5.0 uniq.c源碼分析

coreutils5.0 uniq.c源碼分析
運動了一會兒,讓身體動起來,這樣更有利於思維活躍起來。
接着打開uniq.c的源碼。原來,總認爲代碼太長,今天,先不管長度,把代碼從頭到尾翻一次,找出其核心的算法,一旦能從宏觀上理解處理算法,至於細節,就只能慢慢看了。畢竟C語言是一種相當細的語言。
先弄個測試文件
a.3內容如下
1
2
2
3
3
3
4
然後進行測試
./uniq a.3
並加上不同選項,這個程序也要求文件是排好序的。這就意味着,就類似於如下題目
arr=[1,2,2,3,3,3,4]
從數組中選出重複的元素和非重複的元素之類。
我會如何做,肯定是把數組遍歷一次,然後把當前數據和之前的進行比較,如果相同,就把重複次數加1,如果不相同,表示又出現一個新的數據。
從頭翻到尾,找到main中沒有做什麼正理,只是調用了check_file,再分析check_file函數。發現當uniq不帶選項時,輸出如下:
./uniq a.3
1
2
3
4
這樣的處理邏輯在哪兒呢?
應該是當前行如果與上一行不同,就輸出,如果相同,就不輸出,繼續讀下一行。找呀找,果然找到這樣的邏輯,在代碼299行,發現了處理邏輯,
先初始化prevline字段
循環讀文件
  從文件中讀一行到thisline
  比如prevline和thisline
  如果不同或prevline初始化的值
    打印thisline行
    把thisline當成上一行,賦值給prevline
----
這個邏輯還是很好明白的。象
uniq -c
uniq -d
之類選項的功能,處理邏輯也差太多,就不細講了。其實,我沒有細看。講不出來。
 

發佈了225 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章