簡體   English   中英

在 C 中使用 fscanf() 如何區分文件結尾和錯誤?

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

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