[英]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
完全沒問題。 之后,如果你想知道循環是否由於只是到達文件的末尾或由於錯誤而結束,你應該調用ferror
或feof
。 如果你不在乎你可以跳過這個電話。
請注意,檢查feof
或ferror
是否很重要,因為流的錯誤指示符是粘性的,即使命中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.