別再用"while (!feof(file))"來逐行讀取txt文件了!


起因

執行一個C/C++程序出現segment fault。它逐行讀取文本文件,每一行是一個圖片名字,然后讀圖、處理圖像,etc。
發現最后一次讀取的文件名不存在(空的)。

正確的逐行讀取txt文件

這是正確的寫法:

#include <stdio.h>
#include <string.h>

int main(){
    FILE* fp = fopen("/home/zz/images/face.txt", "r");

    char line[1024];

    void* ret;
    while(1) {
        memset(line, 0, sizeof(line));
        ret = fgets(line, sizeof(line), fp);
        if(ret==NULL) break;
        line[strlen(line)-1] = '\0'; // trim '\n'
        printf("line is: %s!\n", line);
    }

    fclose(fp);

    return 0;
}

使用while (!feof(file))來逐行讀取txt是錯誤

簡單說就是,如果用while (!feof(file)),那么會比文件內容多一行。至於讀取到什么,看你的buffer有沒有每次做memset,如果有那么讀取到空的;如果沒有,讀取到上一次的。

原理上,feof()操作是主動去查看文件流指針file是否到達了EOF。執行這個判斷時並沒有“進行下一次讀取”。因此,即便已經讀取完了文件最后一行,因為feof()不會把文件流指針file前移,因此得到的判斷仍然是“現在不是EOF”。進而執行下一行的讀取(不正確的讀取)。

其實文件系統也好,並發也好,我們應該直接去讀取,然后判斷讀取后的返回值是否為EOF或別的;而不是先去查詢當前是否為EOF,然后再讀取。

參考

Why is “while (!feof(file))” always wrong?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM