fgets()的返回值

yad*_*_vi 10 c io fgets

我最近刚开始工作I/OC.这是我的问题 -
我有一个文件,我从中读取了我的输入.然后我用来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");
}
Run Code Online (Sandbox Code Playgroud)

abl*_*igh 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为指示错误.

这清楚地表明它只会返回a,NULL如果它实际上在EOF被调用时,即如果读取任何字节,它将不会返回NULL.

  • 你再次执行`fgets()`,你会得到`EOF`.这是正常的测试方式. (2认同)