簡體   English   中英

fgets()的返回值

[英]Return value of fgets()

我剛剛開始在C使用I/O 這是我的問題 -
我有一個文件,我從中讀取了我的輸入。 然后我使用fgets()來獲取緩沖區中的字符串,我以某種方式使用它。 現在,如果輸入對於緩沖區而言太短,即fgets()的第一次讀取達到EOF ,會發生什么。 fgets()應該返回NULL (正如我在fgets()文檔中讀到的那樣)? 它似乎沒有,我得到了正確的輸入。 除了我的feof(input)並沒有說我們已經達到了EOF
這是我的代碼片段。

char    buf[BUFSIZ];
FILE    *input,
        *output;

input   = fopen(argv[--argc], "r");
output  = fopen(argv[--argc], "w");

/**
 *  If either of the input or output were unable to be opened
 *          we exit
 */
if (input == NULL) {
    fprintf(stdout, "Failed to open file - %s.\n", argv[argc + 1]);
    exit(EXIT_FAILURE);
}

if (output == NULL) {
    fprintf(stdout, "Failed to open file - %s.\n", argv[argc + 0]);
    exit(EXIT_FAILURE);
}

if (fgets(buf, sizeof(buf), input) != NULL) {
    ....
}

/**
 *  After the fgets() condition exits it is because, either -
 *      1) The EOF was reached.
 *      2) There is a read error.
 */
if (feof(input)) {
    fprintf(stdout, "Reached EOF.\n");
}
else if (ferror(input)) {
    fprintf(stdout, "Error while reading the file.\n");
}

fgets()的文檔沒有說出你的想法:

從我的手冊頁

fgets()從流中讀取最多一個小於size字符,並將它們存儲到s指向的緩沖區中。 讀數在EOF或換行符后停止。 如果讀取換行符,則將其存儲到緩沖區中。 終止空字節(' \\0 ')存儲在緩沖區中的最后一個字符之后。

然后

gets()fgets()在成功時返回s ,在出錯時或在文件結束時沒有讀取任何字符時返回NULL

我沒有讀到,因為說EOF將被視為錯誤條件並返回NULL 實際上它說只有在沒有讀取字符的情況下發生EOF時才會出現NULL

POSIX標准(遵循不太容易訪問的C標准)在這里: http//pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html並聲明:

成功完成后, fgets()將返回s 如果流位於文件末尾,則應設置流的文件結束指示符,並且fgets()應返回空指針。 如果發生讀錯誤,則應設置流的錯誤指示符, fgets()應返回空指針,並設置errno以指示錯誤。

這清楚地表明,如果在調用時它實際上處於EOF狀態,它將僅返回NULL ,即如果讀取任何字節,則不會返回NULL

暫無
暫無

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

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