一、需求描述
要求對一個包含若幹行記錄且某幾條記錄相同的檔案(源檔案)實作去重操作,并将去重之後的記錄寫入到另外一個檔案(目的檔案)中。也即最後生成的檔案中沒有内容相同的兩行記錄。如果源檔案中兩條記錄之間有空行,則在目的檔案中一并将其去掉。
兩條記錄相同的标準是:
1) 字元個數及内容完全相同。
2) 去除空格及回車換行符之後的内容完全相同。
示例:
源檔案樣例:
對應的目的檔案樣例:
二、程式總體流程
為了實作去重操作,我們考慮使用連結清單資料結構。先将源檔案中的記錄内容逐條讀取,與連結清單中已經存在的記錄内容相比較,如果沒有與之相同的,則将該條記錄加傳入連結表。當源檔案中的所有記錄内容都讀取完成之後,再将連結清單中的記錄内容寫入到目的檔案中。
程式的總體流程如圖1所示。

圖1 程式的總體流程
三、重要程式流程及資料結構介紹
1.存放記錄内容的連結清單
本程式使用連結清單來存放從源檔案中讀取到的每條記錄,該連結清單的結構如下:
2.判斷某條記錄是否已存在于連結清單的函數
每當讀取到一條記錄,就要判斷該條記錄是否已經存在于連結清單中了(第一條記錄除外)。判斷操作非常的簡單,隻需要周遊整個連結清單就可以了。該操作由IsInList函數實作,其具體代碼如下:
3.去除記錄的回車換行符、去除記錄中的空格的函數
RmNewLine函數用于去除記錄的回車換行符,RemoveSpaceInStr函數用于去除記錄中的空格。這兩個函數的程式代碼請見附錄。
四、程式編譯及執行結果
将RemoveRepeatLine.c(詳細的代碼請見附錄)程式上傳到Linux機器上,使用gcc -g -o RemoveRepeatLine RemoveRepeatLine.c指令對其編譯,生成RemoveRepeatLine。
在本程式中,我們使用的源檔案為TestFile.txt,位于目前使用者的zhouzhaoxiong/zzx/RemoveRepeatLine/TestFile目錄下;生成的目的檔案為ResultFile.txt,與源檔案位于相同的目錄之下。
本人使用的源檔案TestFile.txt的内容為:
運作RemoveRepeatLine指令之後,生成結果檔案ResultFile.txt,其内容為:
可見,程式滿足了需求,去除了重複的行,同時将多餘的空行也去掉了。
五、總結
關于本程式,有如下幾點說明:
第一,連結清單這種資料結構在實際的軟體開發項目中應用得非常的廣泛,大家一定要熟練掌握其用法,特别是如何向連結清單中插入資料、如何周遊整個連結清單、如何清空連結清單等。
第二,寫檔案函數WriteToFile中,在“strncpy(szContentBuf, ptContentListHead->szContentLine, strlen(ptContentListHead->szContentLine));”語句之前,一定要加上“memset(szContentBuf, 0x00, sizeof(szContentBuf));”語句,否則寫入檔案中的内容可能不是我們想要的。大家也可以在自己的機器上試試,看加與不加“memset(szContentBuf, 0x00, sizeof(szContentBuf));”語句,生成的結果檔案有何差別。
第三,在有關話單生成及處理的程式中,對源話單檔案進行去重操作是大家必須考慮的問題。本文中的程式為相關項目的開發人員提供了參考。
附:完整的程式代碼