039. 读写二进制文件

在C语言中,读写二进制文件与读写文本文件类似,但需要使用不同的模式和函数。二进制文件以字节流的形式存储数据,适合存储结构化数据(如结构体)或需要保持原始格式的数据。

1. 打开二进制文件

使用fopen函数打开二进制文件时,需要指定正确的模式:

  • "rb":以二进制模式打开文件用于读取。

  • "wb":以二进制模式打开文件用于写入,文件内容会被清空。

  • "ab":以二进制模式打开文件用于追加,写入的内容会追加到文件末尾。

  • "r+b""w+b""a+b":以二进制模式打开文件用于读写。

示例1:打开二进制文件

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

int main() {
    FILE *file;

    // 打开文件用于写入
    file = fopen("example.bin", "wb");
    if (file == NULL) {
        perror("Failed to open file");
        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;
}

输出结果

File opened successfully.
File closed successfully.

2. 写入二进制文件

使用fwrite函数将数据写入二进制文件。fwrite函数的原型如下:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
  • ptr:指向要写入的数据的指针。

  • size:每个数据项的大小(以字节为单位)。

  • count:要写入的数据项的数量。

  • stream:文件指针。

  • 返回值:成功写入的数据项的数量。

示例2:写入二进制文件

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

int main() {
    FILE *file;
    int data[] = {1, 2, 3, 4, 5};
    size_t size = sizeof(data) / sizeof(data[0]);

    // 打开文件用于写入
    file = fopen("example.bin", "wb");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 写入数据
    if (fwrite(data, sizeof(int), size, file) != size) {
        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.

3. 读取二进制文件

使用fread函数从二进制文件中读取数据。fread函数的原型如下:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
  • ptr:指向存储读取数据的缓冲区的指针。

  • size:每个数据项的大小(以字节为单位)。

  • count:要读取的数据项的数量。

  • stream:文件指针。

  • 返回值:成功读取的数据项的数量。

示例3:读取二进制文件

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

int main() {
    FILE *file;
    int data[5];
    size_t size = sizeof(data) / sizeof(data[0]);

    // 打开文件用于读取
    file = fopen("example.bin", "rb");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 读取数据
    if (fread(data, sizeof(int), size, file) != size) {
        perror("Failed to read from file");
        fclose(file);
        return 1;
    }

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

    // 打印读取的数据
    for (size_t i = 0; i < size; i++) {
        printf("data[%zu] = %d\n", i, data[i]);
    }

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

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

输出结果

Data read successfully.
data[0] = 1
data[1] = 2
data[2] = 3
data[3] = 4
data[4] = 5
File closed successfully.

4. 读写结构体

二进制文件非常适合存储结构体数据。以下是一个示例,展示如何将结构体写入二进制文件并读取。

定义结构体

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

struct Person {
    char name[50];
    int age;
    float height;
};

写入结构体到二进制文件

int main() {
    FILE *file;
    struct Person person = {"Alice", 25, 165.5};

    // 打开文件用于写入
    file = fopen("person.bin", "wb");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 写入结构体
    if (fwrite(&person, sizeof(struct Person), 1, file) != 1) {
        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;
}

读取结构体从二进制文件

int main() {
    FILE *file;
    struct Person person;

    // 打开文件用于读取
    file = fopen("person.bin", "rb");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 读取结构体
    if (fread(&person, sizeof(struct Person), 1, file) != 1) {
        perror("Failed to read from file");
        fclose(file);
        return 1;
    }

    printf("Data read successfully.\n");
    printf("Name: %s\n", person.name);
    printf("Age: %d\n", person.age);
    printf("Height: %.2f cm\n", person.height);

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

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

输出结果

Data read successfully.
Name: Alice
Age: 25
Height: 165.50 cm
File closed successfully.

通过上述示例,你可以看到如何在C语言中读写二进制文件:

  1. 打开二进制文件:使用fopen函数,并指定正确的模式(如"rb""wb"等)。
  2. 写入二进制文件:使用fwrite函数将数据写入文件。
  3. 读取二进制文件:使用fread函数从文件中读取数据。
  4. 读写结构体:可以将结构体直接写入和读取二进制文件,确保数据格式一致。

视频讲解

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