簡體   English   中英

fgetc():只需檢查EOF就夠了嗎?

[英]fgetc(): Is it enough to just check EOF?

在網絡上找到的各種例子中, fgetc()的使用方式如下:

FILE *fp = fopen(PATH, "r");

if (fp == NULL) {
    perror("main");
    exit(EXIT_FAILURE);
}

int ch;

while (ch = fgetc(fp) != EOF) {
    // do something
}

但根據fgetc()的聯機幫助頁

如果發生讀錯誤,則應設置流的錯誤指示符,fgetc()應返回EOF,[CX]並設置errno以指示錯誤。

所以我需要檢查一下嗎? 如何?

你可以在一段時間之后用ferror(3)檢查它:

while (EOF != (ch = fgetc(fp)))
   // do something

if (ferror(fp) != 0)
   // error handling

如果發生錯誤,ferror返回非零值。

如果您想在發生錯誤后使用fp,則需要使用clearerr清除錯誤標志:

clearerr(fp);

循環直到fgetc返回EOF完全沒問題。 之后,如果你想知道循環是否由於只是到達文件的末尾或由於錯誤而結束,你應該調用ferrorfeof 如果你不在乎你可以跳過這個電話。

請注意,檢查feofferror是否很重要,因為流的錯誤指示符是粘性的,即使命中eof是fgetc失敗的原因,也可以評估為true。 通常你應該使用feof來檢查,如果它返回false,則斷定循環因新錯誤而停止。

這是規格說的:

fgetc()函數將獲得下一個字節作為轉換為int的unsigned char

以下宏名稱應定義為負整數常量表達式:EOF

只要將返回值存儲在int而不是char ,就足以檢查EOF因為它保證不代表有效的字符值。


另外,在您的代碼中,這個:

while (ch = fgetc(fp) != EOF)

應該:

while ((ch = fgetc(fp)) != EOF)

附加括號是必需的,因為!=優先級高於=

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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