此链接说明了为什么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