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

标签 c file-io fgets feof

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/

相关文章:

c++ - 混合的 C/C++ header 是否可以包含另一个混合 header ?

python - 从第 2 行读取文件或跳过标题行

C使用结构使用sscanf将fgets()char数组解析为多个变量

c - 链表中的字符串输入 [C]

c++ - 将字符串放入 ifstream 方法中

c - 使用 Fgets 读取 cpp 文件的所有行

c - `Cannot find -lmalloc`,错误 : ld returned 1 exit status

c++ - 有没有办法获取函数的大小并为其复制和执行分配内存?

c - 如何使用循环访问矩阵的元素

python - 如何检查文件是否是视频