This link讲述为什么 feof()
用作循环的退出指示器是一件坏事。
不安全==>在 while 中进行 feof()
检查,并在 while 内进行 fgets()
检查。
安全==>让fgets()!=NULL
检查while本身。
我应该看到不安全的代码执行额外的 while 循环迭代,但两者都执行相同(且正确)的循环次数。有人可以帮助我了解这里发生了什么吗?
编辑:该链接实际上确实说明了为什么会发生这种情况,但需要下面的正确答案才能准确理解我正在阅读的内容。我的文件最后一行没有“\n”,因此得到了相同的结果。
这是文件内容:
abcd
efgh
ijkl
这是代码:
void testUnsafe(void) {
FILE *f;
char buf[20];
f = fopen("fil.txt", "r");
while (!feof(f)) {
fgets(buf, 20, f);
if (buf[strlen(buf) - 1] == '\n') //cleaner
buf[strlen(buf) - 1] = '\0';
printf("%s , %d\n", buf, strlen(buf));
}
fclose(f);
}
void testSafe(void) {
FILE *f;
char buf[20];
f = fopen("fil.txt", "r");
while (fgets(buf, 20, f) != NULL) {
if (buf[strlen(buf) - 1] == '\n') //cleaner
buf[strlen(buf) - 1] = '\0';
printf("%s , %d\n", buf, strlen(buf));
}
fclose(f);
}
输出是:
******unsafe test********
abcd , 4
efgh , 4
ijkl , 4
********safe test********
abcd , 4
efgh , 4
ijkl , 4
最佳答案
如果您的文本文件在最后一行文本后没有结束换行符,则 testUnsafe()
函数在读取最后一行时将到达文件结尾,并生成您所显示的三行输出。
如果您的文本文件在最后一行文本后确实有换行符,则该函数将读取最后一行,包括换行符,而不会到达结尾-文件。当它再次进入 while()
循环时,它读取零个字符,设置文件结束标志,并输出上一轮仍在缓冲区中的最后一行。
while (!feof(f))
构造本身并不是不安全的。。它忽略了检查 fgets()
的返回值,这是不安全的。
关于c - 使用 feof() 从文件读取并退出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463126/