簡體   English   中英

在C文件處理中的feof()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM