C 确定EOF的优雅方法?

C 确定EOF的优雅方法?,c,file,eof,C,File,Eof,我从一个文本文件中读取,在(!feof)循环时使用进行迭代, 但每当我使用这个条件时,循环会额外迭代一次 我用这个“补丁”代码解决了这个问题 while (stop == FALSE) { ... terminator = fgetc(input); if (terminator == EOF) stop = TRUE; else fseek(input, -1, SEEK_CUR); } 但是

我从一个文本文件中读取,在(!feof)循环时使用
进行迭代,
但每当我使用这个条件时,循环会额外迭代一次

我用这个“补丁”代码解决了这个问题

while (stop == FALSE)
{
 ...

        terminator = fgetc(input);
        if (terminator == EOF)
            stop = TRUE;
        else
            fseek(input, -1, SEEK_CUR);
}

但是它的外观和感觉都非常糟糕。

您可以利用这样一个事实,即赋值将作为被赋值的值进行计算,在本例中,赋值将被赋值给正在读取的字符:

while((terminator = fgetc(input))!= EOF) {
    // ...
}

下面是一个惯用的例子():


同样,您可以逐行阅读:

char buf[MAXLINE];
// ...
while((fgets(buf,MAXLINE,stdin)) != NULL) {
       do_something(buf);
}
由于
fgets
复制检测到的换行符,因此可以检测 通过检查倒数第二个缓冲区元素结束行。你可以用
realloc
调整缓冲区大小(确保保留指向缓冲区开头的指针,但将
buf+n
传递到下一个FGET,其中
n
是读取的字符数)。根据有关fgets的标准

从流中读取字符并将其作为C字符串存储到str中,直到读取(num-1)个字符或到达换行符或文件结尾,以先发生的为准。换行符使FGET停止读取,但函数认为它是有效字符,并包含在复制到str的字符串中


或者,您可以使用(参见链接后面的示例)一次性读取整个文件。

如果
,它不会将光标保持在前面一个字符吗EOF
?@贵格会否,为什么会这样?因为fgetc一次前进一个字符,如果
终止符!=EOF
然后终止符将保存一个相关字符,指示器将在其前面。@Quaker什么样的“光标”?那你为什么在乎呢?您将在<代码>终结者中看到您刚读过的角色。感谢您发布此内容。关于
feof()
的问题,这里的热情是。。。累人。@顺便说一句,另一个答案不是同样正确吗?布赖恩,我正在用一个函数逐行读取文本文件,该函数将整行读取为一个字符串。你的解决方案不会导致一个修剪过的字符串(缺少第一行字符)吗?@奎克再次,不,为什么会这样?“桂格,一个小挑剔的东西——请不要在一个被标注为C的问题中引用C++参考。最近几天可能出现的关于C IO的第二十个问题的副本。也许我们需要一个社区维基页面that@H2CO3从技术上说,这不是IOFSUBLE问题的复制品,因为这是C,而另一个是C++。@夏末/初秋,当编程课程开始时,总会出现这样的问题。社区维基页面可能是个好主意。@AdrianMcCarthy是的;不过,这个概念是相同的。
char buf[MAXLINE];
// ...
while((fgets(buf,MAXLINE,stdin)) != NULL) {
       do_something(buf);
}