优雅的方式来确定EOF?

时间:2013-08-30 14:08:03

标签: c file eof

我正在阅读一个文本文件,使用while(!feof)循环进行迭代, 但每当我使用这个条件时,循环就会迭代一段额外的时间。

我用这个'补丁'代码

解决了这个问题
while (stop == FALSE)
{
 ...

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

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

3 个答案:

答案 0 :(得分:7)

你可以利用这样一个事实,即赋值被评估为被赋值,在本例中是被读取的字符:

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

答案 1 :(得分:6)

这是一个惯用的例子(source):

fp = fopen("datafile.txt", "r"); // error check this!

// this while-statement assigns into c, and then checks against EOF:

while((c = fgetc(fp)) != EOF) {
    /* ... */
}

fclose(fp);

答案 2 :(得分:0)

同样,你可以逐行阅读:

char buf[MAXLINE];
// ...
while((fgets(buf,MAXLINE,stdin)) != NULL) {
       do_something(buf);
}

由于fgets复制了检测到的换行符,因此您可以检测到 通过检查倒数第二个缓冲区元素来结束行。您可以使用 realloc调整缓冲区的大小(确保指向缓冲区的开头,但将buf+n传递给下一个fgets,其中n是读取的字符数)。根据{{​​1}}的标准:

  

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

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