gpt4 book ai didi

c - 使用 feof() 从文件读取并退出循环

转载 作者:行者123 更新时间:2023-11-30 18:25:33 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com