Linux下使用fread和fwrite读写二进制文件

时间:2020-12-23 01:13:47

目录

问题描述

问题分析

解决方法


问题描述

在C语言中,当尝试以"wb"模式打开文件并使用fwrite函数写入数据后,当尝试重新设置文件指针并使用fread函数读取数据时,会出现"Bad file descriptor"错误。

问题分析

在使用C语言中的文件操作函数时,请注意以下几点:

  1. 文件打开模式:可以使用多种不同的打开模式打开文件。在写入或读取二进制文件时,建议使用"wb+"或"rb+"模式,以使文件既可读又可写。

  2. 文件指针位置:在使用fread函数读取文件中的数据之前,请确保文件指针已重置到文件开头。可以使用rewindfseek函数来实现这一点。

  3. 错误处理:在处理文件操作时,请务必检查返回值以及可能的错误,并相应地处理它们。可以使用perrorstrerror函数来显示错误消息,以帮助诊断故障。

根据您提供的代码,当以"wb"模式打开文件并使用fwrite函数写入数据后,文件指针仍处于写入模式并无法进行读取操作。因此,在尝试使用rewind函数之后使用fread函数读取数据时,会出现"Bad file descriptor"错误。

解决方法

为了避免在读写二进制文件时出现问题,请遵循以下步骤:

  1. 在打开文件时使用"wb+"或"rb+"模式,以使文件既可读又可写。

  2. 在写入数据后,立即关闭文件指针,并在需要时重新打开它。这将确保文件指针处于正确的位置,以便进行读取操作。

  3. 在尝试读取文件中的数据之前,请使用rewindfseek函数将文件指针重置到文件开头。

  4. 在处理文件操作返回值时,请检查其是否与期望的相等,并根据需要显示错误消息。

以下是修改后的示例程序,其中包含上述建议的解决方案:

#include <stdio.h>

int main() {
    FILE *fp;
    int data[5] = {1, 2, 3, 4, 5};

    // 打开二进制文件以读写模式
    fp = fopen("file.bin", "wb+");
    if (fp == NULL) {
        perror("Error opening file");
        return -1;
    }

    // 写入数据到文件
    int ret = fwrite(data, sizeof(int), 5, fp);
    if(ret != 5) {
        perror("fwrite failed");
    }

    // 关闭文件指针并重新打开它
    fclose(fp);
    fp = fopen("file.bin", "rb+");
    if (fp == NULL) {
        perror("Error opening file");
        return -1;
    }

    // 将文件指针重置到文件开头
    rewind(fp);

    // 从文件中读取数据
    int read_data[5];
    ret = fread(read_data, sizeof(int), sizeof(read_data) / sizeof(int), fp);
    if(ret != 5) {
        perror("fread failed");
    }

    // 输出读取的数据
    for (int i = 0; i < 5; i++) {
        printf("%d ", read_data[i]);
    }

    // 关闭文件指针
    fclose(fp);

    return 0;
}

在此示例程序中,我们首先使用"wb+"模式打开文件,并使用fwrite函数将整数数组写入文件。接下来,我们立即关闭文件指针,并再次打开它以使其处于正确的读取位置。然后,我们使用rewind函数将文件指针重置到文件开头,并使用fread函数从文件中读取数据。最后,我们输出读取的数据并关闭文件指针。

在这个更新的示例程序中,我们采用了打开模式、关闭和重新打开文件指针以及指针位置等多种解决方案,以确保在读写二进制文件时不会出现问题。

希望这个简要指南可以帮助您更好地理解如何在C语言中读写二进制文件,并避免常见的错误和问题!