起因
執行一個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,然后再讀取。