首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實現文件去重:鏈表存儲與字符串預處理完整方案

     編輯:關於C語言

C語言實現文件去重:鏈表存儲與字符串預處理完整方案

需求:讀取源文件,移除重複行(判斷標準:1) 字符完全相同;2) 去除空格與換行後相同),並將結果寫入目標文件,同時刪除空行。

整體流程

  1. 逐行讀取源文件(fgets)。
  2. 預處理:移除行尾換行符(RmNewLine)、移除所有空格(RemoveSpaceInStr)。
  3. 若處理後行長為 0,跳過(刪除空行)。
  4. 遍歷鏈表檢查是否已存在(IsInList),不存在則插入鏈表尾部。
  5. 讀取完畢後,將鏈表內容順序寫入目標文件(WriteToFile)。
  6. 釋放鏈表記憶體(ClearList)。

程序總體流程圖

核心數據結構

typedef struct T_FileInfoStruct {
    UINT8 szContentLine[256];
    struct T_FileInfoStruct *pNext;
} T_FileInfo;

關鍵函式實現節錄

判斷行是否存在於鏈表

UINT32 IsInList(T_FileInfo *head, UINT8 *line) {
    if (!head || !line) return 0;
    while (head) {
        if (strncmp(line, head->szContentLine, strlen(line)) == 0) return 1;
        head = head->pNext;
    }
    return 0;
}

移除空格

void RemoveSpaceInStr(UINT8 *str, UINT32 len) {
    UINT8 buf[256], res[256];
    memcpy(buf, str, len);
    UINT32 dst = 0;
    for (UINT32 src = 0; src < strlen(buf); src++) {
        if (buf[src] != ' ') res[dst++] = buf[src];
    }
    res[dst] = '\0';
    memcpy(str, res, len);
}

寫入文件時的關鍵細節

在 WriteToFile 中,每次寫入前必須 memset(szContentBuf, 0, sizeof(szContentBuf)) 清空緩衝區,否則殘留數據會導致輸出錯誤。

編譯與測試

gcc -g -o RemoveRepeatLine RemoveRepeatLine.c
./RemoveRepeatLine

源文件 TestFile.txt → 目標文件 ResultFile.txt,成功去除重複行與空行。

總結與工程應用

  • 鏈表是實際項目中高頻數據結構,需熟練掌握增、刪、改、查、遍歷、銷毀操作。
  • 文件去重在話單處理、日誌分析等場景極為常見,本程序可作為參考基礎。
  • 注意跨平台路徑拼接(示例使用 getenv("HOME")),實際部署時應改為配置文件或命令行參數指定路徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved