2

我正在从文本文件中读取,并使用while(!feof)循环进行迭代,但是每当我使用此条件时,循环都会迭代额外的时间。

我用这个“不完整”的代码解决了这个问题

while (stop == FALSE)
{
 ...

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

但它看起来和感觉都很糟糕。

4

3 回答 3

7

您可以利用赋值被评估为被赋值的事实,在这种情况下是被读取的字符:

while((terminator = fgetc(input))!= EOF) {
    // ...
}
于 2013-08-30T14:09:43.867 回答
6

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

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);
于 2013-08-30T14:11:09.420 回答
0

同样,您可以逐行阅读:

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

由于fgets复制检测到的换行符,您可以通过检查倒数第二个缓冲区元素来检测行尾。您可以使用 realloc来调整缓冲区的大小(确保保留指向缓冲区开头的指针,但将buf+n, 传递给下一个 fget,其中n是读取字符的数量)。从有关标准fgets

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

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

于 2013-08-30T14:31:34.683 回答