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语言中读写二进制文件:
- 打开二进制文件:使用
fopen
函数,并指定正确的模式(如"rb"
、"wb"
等)。 - 写入二进制文件:使用
fwrite
函数将数据写入文件。 - 读取二进制文件:使用
fread
函数从文件中读取数据。 - 读写结构体:可以将结构体直接写入和读取二进制文件,确保数据格式一致。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)