【发布时间】:2014-03-07 21:27:09
【问题描述】:
我最近刚刚开始在C 中使用I/O。这是我的问题 -
我有一个文件,我从中读取了我的输入。然后我使用fgets() 在缓冲区中获取字符串,我以某种方式使用它。现在,如果输入对于缓冲区来说太短会发生什么,即如果fgets() 的第一次读取达到EOF。 fgets() 是否应该返回 NULL(正如我在 fgets() 文档中阅读的那样)?似乎没有,我得到了正确的输入。此外,即使我的feof(input) 也没有说我们已经到达EOF。
这是我的代码 sn-p。
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");
}
【问题讨论】:
-
请注意,
feof(input)只会在 尝试读取过去 EOF 之后返回true。它不会告诉你你在 在 EOF。 -
你能在上面的例子中解释一下吗?假设,
fgets()只读取100 bytes(BUFSIZE是 512),fgets()是否应该返回NULL? -
好的,现在我意识到我的评论是多么愚蠢;反正我明白你的意思。如何检查是否达到 EOF?