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和states:
成功完成后,
fgets()
将返回s
。 如果流位于文件结尾,则应设置流的文件结束指示符,并且fgets()
应返回空指针。 如果发生读错误,则应设置流的错误指示符,fgets()
应返回空指针,并设置errno
以指示错误。
这清楚地表明,如果在调用时它实际上处于EOF
状态,它将仅返回NULL
,即如果读取任何字节,则不会返回NULL
。