我正在阅读一个文本文件,使用while(!feof)
循环进行迭代,
但每当我使用这个条件时,循环就会迭代一段额外的时间。
我用这个'补丁'代码
解决了这个问题while (stop == FALSE)
{
...
terminator = fgetc(input);
if (terminator == EOF)
stop = TRUE;
else
fseek(input, -1, SEEK_CUR);
}
但它的外观和感觉非常糟糕。
答案 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()一次性阅读整个文件(请参阅链接后的示例)。