[英]feof() in C file handling
我正在逐字節讀取二進制文件,我需要確定是否已達到eof。
feof()不起作用“只有在對不存在的字節進行讀取請求時才設置eof”。 所以,我可以使用我的自定義check_eof:
if ( fread(&byte,sizeof(byte),1,fp) != 1) {
if(feof(fp))
return true;
}
return false;
但問題是,如果沒有達到eof,我的文件指針會向前移動一個字節。 因此,解決方案可能是使用ftell()
然后使用fseek()
來使其處於正確的位置。
另一種解決方案可能是在一些臨時存儲中緩沖前面的字節。
更好的解決方案?
如果您一次讀取一個字節,那么使用fgetc
執行此操作的慣用方法是:
int c;
while ((c = fgetc(fp)) != EOF) {
// Do something.
}
然后你不應該處理feof
。
我通常做這樣的事情:
int get_next_char(FILE* fp, char *ch)
{
return fread(ch, sizeof(char),1, fp) == 1;
}
// main loop
char ch;
while (get_next_char(fp, &ch))
process_char(ch);
if (!feof(fp))
handle_unexpected_input_error(fp);
最好構建你的代碼,以便你嘗試讀取一些數據,如果讀取因為到達文件結尾而沒有成功,你可以在那里處理它(即參見Kristopher Johnson的答案 )。
如果您非常討厭這個,可以使用ungetc
將單個字符返回到流中,它將在下一次讀取調用中可用:
int c = fgetc(fp);
if (c == EOF)
{
// handle eof / error
}
else
{
ungetc(c, fp);
// the next read call is guaranteed to return at least one byte
}
我不清楚,但是如果你在讀取字節之前有興趣知道如果已達到EOF,則將你的feof()測試放在fread()之前而不是之后。
實際上,如果我讀得正確,你甚至不想這樣做:
return feof(fp) ? true : false;
我建議使用:
fseek(myFile, 0, SEEK_END);
fileLen = ftell(myFile);
fseek(myfile, 0, SEEK_SET);
首次打開文件時確定長度。 然后設置你的讀循環從不讀取結束。 您可以使用ftell
找出您的位置,並與fileLen進行比較,以確定您還需要進一步操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.