C语言ferror 和 feof 的正确使用

在 C 语言中,ferror 和 feof 是用于检查文件流状态的函数。它们通常用于文件操作(如 fread、fwrite、fscanf 等)后,判断是否发生了错误或是否到达了文件末尾。正确使用这两个函数对于编写健壮的文件操作代码至关重要。


1. ferror 和 feof 的基本功能

ferror

  • 用途:检查文件流是否发生了错误。
  • 返回值
    • 如果发生了错误,返回非零值(通常是 1)。
    • 如果没有错误,返回 0。

feof

  • 用途:检查文件流是否到达了文件末尾(End of File, EOF)。
  • 返回值
    • 如果到达了文件末尾,返回非零值(通常是 1)。
    • 如果没有到达文件末尾,返回 0。

2. 常见误区

误区 1:错误使用 feof

  • 错误代码
while (!feof(fp)) {
    char buffer[100];
    fgets(buffer, sizeof(buffer), fp);
    printf("%s", buffer);
}
  • 问题
    • 它可能会导致不必要的额外循环迭代,因为 feof() 只有在尝试读取文件末尾之后才会返回 true。这意味着如果你使用 feof() 来控制循环,当到达文件末尾时,fgets() 已经执行了一次无效的读操作(这次读操作不会成功读取任何数据),但循环还是会进入下一次迭代。

误区 2:忽略 ferror

  • 错误代码
fread(buffer, sizeof(char), 100, fp);
if (feof(fp)) {
    printf("Reached end of file\n");
}
  • 问题
    • 如果 fread 由于错误(如磁盘损坏)而失败,feof 不会检测到错误,程序会错误地认为到达了文件末尾。

3. 正确使用 ferror 和 feof

正确模式

  • 在文件操作后,先检查 ferror,再检查 feof。这样可以确保正确处理错误和文件末尾。

示例代码

#include <stdio.h>

int main() {
    FILE *fp = fopen("example.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    char buffer[100];
    while (1) {
        // 尝试读取数据
        size_t bytes_read = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);

        // 检查是否发生错误
        if (ferror(fp)) {
            perror("Error reading file");
            break;
        }

        // 检查是否到达文件末尾
        if (feof(fp)) {
            printf("\nReached end of file\n");
            break;
        }
    }

    fclose(fp);
    return 0;
}

4. 详细解释

1. 打开文件

FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
    perror("Failed to open file");
    return 1;
}
  • 使用 fopen 打开文件,并检查是否成功。
  • 如果失败,使用 perror 输出错误信息并退出。

2. 读取数据

size_t bytes_read = fread(buffer, sizeof(char), sizeof(buffer) - 1, fp);
  • 使用 fread 读取数据。
  • sizeof(buffer) - 1 确保为字符串终止符 \0 留出空间。

3. 检查错误

if (ferror(fp)) {
    perror("Error reading file");
    break;
}
  • 使用 ferror 检查是否发生了错误。
  • 如果发生错误,输出错误信息并退出循环。

5. 检查文件末尾

if (feof(fp)) {
    printf("\nReached end of file\n");
    break;
}
  • 使用 feof 检查是否到达了文件末尾。
  • 如果到达文件末尾,输出提示信息并退出循环。

6. 关闭文件

fclose(fp);
  • 使用 fclose 关闭文件,释放资源。

5. 测试用例

输入文件 example.txt

Hello, World!
This is a test file.
Today is sunny.
So,you can go out for a walk.

输出

Hello, World!
This is a test file.
Today is sunny.
So,you can go out for a walk.
Reached end of file

错误情况

如果文件读取过程中发生错误(如磁盘损坏),程序会输出:

Error reading file: Input/output error

6. 总结

函数

用途

注意事项

ferror

检查文件流是否发生了错误

在每次文件操作后调用

feof

检查文件流是否到达了文件末尾

仅在读取操作后调用,避免重复输出

通过正确使用 ferror 和 feof,可以编写出健壮的文件操作代码,避免常见的错误和陷阱。

原文链接:,转发请注明来源!