C fgets()的返回值
我最近刚开始在C fgets()的返回值,c,io,fgets,C,Io,Fgets,我最近刚开始在C中使用I/O。这是我的问题-我有一个文件,我从中读取输入。然后我使用fgets()获取缓冲区中的字符串,我以某种方式使用了缓冲区。现在,如果输入对于缓冲区来说太短,即如果fgets()读取的第一个数据达到EOF,会发生什么情况。是否应该fgets()返回NULL(正如我在fgets()文档中读到的那样)?似乎没有,我得到了正确的输入。此外,即使是我的feof(input)也没有说我们已经达到了EOF这是我的代码片段 char buf[BUFSIZ]; FILE *in
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
。实际上,它说NULL
只会在没有读取字符的情况下发生EOF
时发生
POSIX标准(遵从不易访问的C标准)如下所示:并声明:
成功完成后,fgets()
将返回s
。如果流位于文件末尾,则应设置流的文件末尾指示器,并且fgets()
应返回空指针。如果发生读取错误,应设置流的错误指示器,fgets()
应返回空指针,并应设置errno
以指示错误
这清楚地表明,如果调用时它实际上处于
EOF
,它只会返回NULL
,也就是说,如果读取了任何字节,它不会返回NULL,注意feof(input)
只有在尝试读取超过EOF后才会返回true。它没有告诉你你在EOF。你能在上面的例子中解释一下吗。假设,fgets()
只读取100字节(BUFSIZE
是512),应该fgets()
返回NULL
?好了,现在我意识到我的评论有多愚蠢;无论如何,我明白你的意思。如何检查是否达到EOF?您能否解释一下feof()
part,为什么它不打印任何内容EOF
已到达,对吗?feof()
测试文件结束指示符,只有在您试图读取文件结束时出现错误时,才会设置该指示符。它并不(令人困惑地)表明您在文件末尾。如果再次执行fgets()
,您将获得EOF
。“这是测试的正常方式。”亚达夫·维沙尔说。继续使用fgets
,直到看到它返回NULL
以结束循环。此时,feof
应该为真,因为NULL
表示fgets
试图读取超过EOF的数据。明白了!谢谢我使用了if()
,应该使用while()
。