038. 处理文件错误

在C语言中,处理文件操作时可能会遇到各种错误,例如文件不存在、权限不足、磁盘空间不足等。正确地处理这些错误可以提高程序的健壮性和用户体验。C语言提供了多种方式来检测和处理文件操作中的错误。

1. 检查文件指针是否为NULL

在使用fopen函数打开文件时,如果文件打开失败,fopen会返回NULL。因此,检查文件指针是否为NULL是处理文件打开错误的常用方法。

示例1:检查文件打开是否成功

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Failed to open file"); // 使用perror打印错误信息
        return 1;
    }

    // 文件操作逻辑
    printf("File opened successfully.\n");

    // 关闭文件
    if (fclose(file) != 0) {
        perror("Failed to close file");
        return 1;
    }

    printf("File closed successfully.\n");
    return 0;
}

输出结果(如果文件不存在)

Failed to open file: No such file or directory

输出结果(如果文件存在)

File opened successfully.
File closed successfully.

2. 使用perrorstrerror

perror函数用于打印错误信息,它会根据全局变量errno的值输出具体的错误描述。strerror函数则返回一个指向错误描述字符串的指针。

示例2:使用perrorstrerror

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("Failed to open file"); // 使用perror打印错误信息
        fprintf(stderr, "Error: %s\n", strerror(errno)); // 使用strerror获取错误描述
        return 1;
    }

    // 文件操作逻辑
    printf("File opened successfully.\n");

    // 关闭文件
    if (fclose(file) != 0) {
        perror("Failed to close file");
        return 1;
    }

    printf("File closed successfully.\n");
    return 0;
}

输出结果(如果文件不存在)

Failed to open file: No such file or directory
Error: No such file or directory

3. 检查文件操作函数的返回值

除了fopen,其他文件操作函数(如freadfwritefseek等)也有返回值,可以用来检测操作是否成功。

示例3:检查文件读取是否成功

#include <stdio.h>
#include <stdlib.h>

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

    char buffer[100];
    size_t result = fread(buffer, 1, sizeof(buffer) - 1, file);
    if (result == 0) {
        perror("Failed to read file");
        fclose(file);
        return 1;
    }
    buffer[result] = '\0'; // 确保字符串以null字符结尾

    printf("File content: %s\n", buffer);

    // 关闭文件
    if (fclose(file) != 0) {
        perror("Failed to close file");
        return 1;
    }

    printf("File closed successfully.\n");
    return 0;
}

输出结果(如果文件读取成功)

File content: Hello, World!
File closed successfully.

4. 使用ferrorfeof

ferror函数用于检查文件流是否发生错误,feof函数用于检查是否到达文件末尾。

示例4:使用ferrorfeof

#include <stdio.h>
#include <stdlib.h>

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

    char buffer[100];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    if (ferror(file)) {
        perror("Error occurred while reading the file");
    } else if (feof(file)) {
        printf("End of file reached.\n");
    }

    // 关闭文件
    if (fclose(file) != 0) {
        perror("Failed to close file");
        return 1;
    }

    printf("File closed successfully.\n");
    return 0;
}

输出结果(如果文件读取成功)

Hello, World!
End of file reached.
File closed successfully.

5. 处理文件写入错误

在写入文件时,也需要检查写入操作是否成功。fwrite函数返回实际写入的字节数,可以用来检测写入错误。

示例5:检查文件写入是否成功

#include <stdio.h>
#include <stdlib.h>

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

    const char *data = "Hello, World!";
    size_t result = fwrite(data, 1, strlen(data), file);
    if (result != strlen(data)) {
        perror("Failed to write to file");
        fclose(file);
        return 1;
    }

    printf("Data written successfully.\n");

    // 关闭文件
    if (fclose(file) != 0) {
        perror("Failed to close file");
        return 1;
    }

    printf("File closed successfully.\n");
    return 0;
}

输出结果(如果文件写入成功)

Data written successfully.
File closed successfully.

通过上述示例,你可以看到如何在C语言中处理文件操作中的错误:

  1. 检查文件指针是否为NULL:在使用fopen时,检查返回值是否为NULL
  2. 使用perrorstrerror:打印错误信息,提供详细的错误描述。
  3. 检查文件操作函数的返回值:如freadfwrite等,确保操作成功。
  4. 使用ferrorfeof:检查文件流是否发生错误或是否到达文件末尾。
  5. 处理文件写入错误:在写入文件时,检查写入操作是否成功。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)