fgets()的返回值

时间:2014-02-10 13:52:36

标签: c io fgets

我刚刚开始在I/O中使用C。这是我的问题 - 我有一个文件,我从中读取了我的输入。然后我使用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");
}

1 个答案:

答案 0 :(得分:14)

fgets()的文档没有说明您的想法:

从我的联机帮助页

  

fgets()从流中读取最多一个小于size个字符,并将它们存储到s指向的缓冲区中。读   在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。存储终止空字节('\0')   在缓冲区中的最后一个字符之后。

以后

  

gets()fgets()成功时返回s,错误时发出NULL,或者在没有读取任何字符时发生文件结束。

我没有读到这一点,因为EOF将被视为错误条件并返回NULL。实际上它表示NULL只会在没有字符被读取时EOF出现。

POSIX标准(遵循不太容易访问的C标准)在这里:http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html并声明:

  

成功完成后,fgets()将返回s。如果流位于文件结尾,则应设置流的文件结束指示符,fgets()将返回空指针。如果发生读错误,则应设置流的错误指示符,fgets()应返回空指针,并设置errno以指示错误。

这清楚地表明,只有当NULL被调用时才返回EOF,即如果读取任何字节,它将不返回{{ 1}}。