[英]How do you differentiate between the end of file and an error using fscanf() in C?
根據手冊, int fscanf(FILE *stream, const char *format, ...)
返回成功匹配和分配的輸入項的數量,該數量可能少於提供的數量,甚至在早期匹配失敗的情況下為零. 我該如何區分:
例如,請參閱fscanf()
的 POSIX 規范的“返回值”部分。
fscanf()
報告零匹配和分配的項目,返回 0。
文件結束由fscanf()
返回 EOF 報告。
第一次調用fscanf()
返回 EOF 會報告一個空文件。
請注意,該規定使得很難發現空文件(無字節)和其中沒有有用數據的文件之間的區別。 考慮這個測試程序(我稱之為eof59.c
,編譯為創建eof59
):
#include <stdio.h>
int main(void)
{
char buffer[256];
int rc;
while ((rc = scanf("%255s", buffer)) != EOF)
printf("%d: %s\n", rc, buffer);
}
如果你用/dev/null
作為輸入(最終的空文件)運行它,它什么也沒說。 但是,如果您向它提供一個帶有單個空格(並且沒有換行符)的文件,或者只是一個換行符,或者實際上是任何空格序列,它也不會說什么。 您還可以嘗試用" x %255s"
替換格式字符串。 給它一個只有一個x
(可能有空格)的文件不會產生任何輸出。 向它提供一個以y
作為第一個字符(空格除外)的文件,程序運行很長時間,在每行輸出上報告0:
:。
請注意, while (!feof(file))
總是錯誤的,但是在諸如scanf()
類的函數返回 EOF 之后,您可以合法地使用feof()
和ferror()
來消除真正的 EOF 和文件流上的錯誤之間的歧義(例如磁盤崩潰或...)。
if (feof(stdin))
printf("EOF on standard input\n");
if (ferror(stdin))
printf("Error on standard input\n");
使用顯示的代碼,您通常應該看到“標准輸入上的 EOF”; 在標准輸入上生成(甚至模擬)錯誤可能非常困難。 您不應看到兩條消息,而應始終看到其中一條消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.