Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets()的返回值_C_Io_Fgets - Fatal编程技术网

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()