C fwrite 函数
最后修改日期:2025 年 4 月 6 日
在 C 编程中,二进制文件处理对于高效的数据存储至关重要。fwrite 函数可以精确地将二进制数据写入文件。本教程将解释 fwrite 的参数,演示各种用例,并提供实际示例。掌握 fwrite 可让您处理复杂的数据结构并优化存储。
什么是 fwrite?
fwrite 函数在 C 中将二进制数据写入文件。它接受四个参数:指向数据的指针、每个元素的大小、元素的数量和文件指针。fwrite 返回成功写入的元素数量。在处理 fwrite 时,请务必使用二进制模式(“wb”、“ab”或“rb+”)以防止数据损坏。
写入单个整数
此示例演示了如何将单个整数写入二进制文件。
#include <stdio.h>
int main() {
FILE *fp;
int num = 42;
fp = fopen("data.bin", "wb"); // Open in binary write mode
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
size_t written = fwrite(&num, sizeof(int), 1, fp);
if (written != 1) {
printf("Error writing to file\n");
}
fclose(fp);
return 0;
}
在此,我们在二进制写入模式(“wb”)下打开“data.bin”。fwrite 函数将内存中的一个整数(通常为 4 字节)写入文件。我们检查返回值以确保写入成功。完成后务必使用 fclose 关闭文件。
写入整数数组
了解如何使用 fwrite 一次写入多个整数。
#include <stdio.h>
int main() {
FILE *fp;
int nums[] = {10, 20, 30, 40, 50};
size_t count = sizeof(nums)/sizeof(nums[0]);
fp = fopen("array.bin", "wb");
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
size_t written = fwrite(nums, sizeof(int), count, fp);
if (written != count) {
printf("Incomplete write operation\n");
}
fclose(fp);
return 0;
}
此示例一次性写入整个整数数组。我们使用 sizeof 算术来计算元素数量。fwrite 高效地处理整个数组,一次性写入所有元素。成功写入的返回值应与我们的元素计数相匹配。
写入结构体
了解如何将自定义数据结构写入二进制文件。
#include <stdio.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
FILE *fp;
Student s = {1, "Alice", 95.5};
fp = fopen("student.bin", "wb");
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
size_t written = fwrite(&s, sizeof(Student), 1, fp);
if (written != 1) {
printf("Failed to write structure\n");
}
fclose(fp);
return 0;
}
在这里,我们定义了一个 Student 结构体,并将一个实例写入文件。fwrite 以二进制格式写入整个结构体,包括所有字段。这种方法保留了结构体的精确内存布局。请注意,由于填充,直接写入结构体是平台相关的。
写入多个结构体
使用此技术高效存储结构体集合。
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
int main() {
FILE *fp;
Point points[] = {{1,2}, {3,4}, {5,6}};
size_t count = sizeof(points)/sizeof(points[0]);
fp = fopen("points.bin", "wb");
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
size_t written = fwrite(points, sizeof(Point), count, fp);
if (written != count) {
printf("Partial structure array written\n");
}
fclose(fp);
return 0;
}
此示例将一个 Point 结构体数组写入二进制文件。我们动态计算元素数量。fwrite 一次性处理整个数组,对于大型数据集来说非常高效。二进制文件将包含结构体的确切内存表示。
追加二进制数据
将数据添加到现有的二进制文件中,而不会覆盖之前的内容。
#include <stdio.h>
int main() {
FILE *fp;
float new_data[] = {1.1, 2.2, 3.3};
fp = fopen("data.bin", "ab"); // Append binary mode
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
size_t written = fwrite(new_data, sizeof(float), 3, fp);
if (written != 3) {
printf("Failed to append all data\n");
}
fclose(fp);
return 0;
}
使用二进制追加模式(“ab”),新数据将被添加到现有文件内容的末尾。文件指针会自动从末尾开始。此示例追加了三个浮点值。当您想保留文件中的现有数据时,追加模式比写入模式更安全。
写入和读回
演示了二进制数据的完整写入-读取周期。
#include <stdio.h>
int main() {
FILE *fp;
double data[] = {3.14, 2.718, 1.618};
double read_data[3];
// Write data
fp = fopen("numbers.bin", "wb");
if (fp == NULL) {
perror("Failed to open file for writing");
return 1;
}
fwrite(data, sizeof(double), 3, fp);
fclose(fp);
// Read data
fp = fopen("numbers.bin", "rb");
if (fp == NULL) {
perror("Failed to open file for reading");
return 1;
}
fread(read_data, sizeof(double), 3, fp);
fclose(fp);
// Verify
for (int i = 0; i < 3; i++) {
printf("%f ", read_data[i]);
}
printf("\n");
return 0;
}
这个完整的示例将一个双精度数组写入文件,然后将它们读回。我们使用二进制写入模式(“wb”)进行写入,使用二进制读取模式(“rb”)进行读取。打印值以验证它们是否已正确存储和检索。这种模式在二进制数据持久化中很常见。
写入动态数据
使用 fwrite 处理动态分配的内存。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
int *dynamic_array;
size_t count = 5;
// Allocate and initialize array
dynamic_array = malloc(count * sizeof(int));
if (dynamic_array == NULL) {
perror("Memory allocation failed");
return 1;
}
for (size_t i = 0; i < count; i++) {
dynamic_array[i] = i * 10;
}
// Write to file
fp = fopen("dynamic.bin", "wb");
if (fp == NULL) {
perror("Failed to open file");
free(dynamic_array);
return 1;
}
size_t written = fwrite(dynamic_array, sizeof(int), count, fp);
if (written != count) {
printf("Partial write occurred\n");
}
fclose(fp);
free(dynamic_array);
return 0;
}
此示例演示了如何将动态分配的内存写入文件。我们分配一个整数数组,初始化它,然后将其写入磁盘。相同的 fwrite 方法可用于堆栈和堆内存。完成后请记住释放分配的内存并关闭文件。
使用 fwrite 的最佳实践
- 始终检查返回值: 验证
fwrite是否返回预期的元素计数。 - 使用二进制模式: 使用“b”标志(例如,“wb”、“rb+”)打开文件以处理二进制数据。
- 优雅地处理错误: 检查文件指针是否为 NULL 以及写入是否不完整。
- 考虑字节序: 二进制文件在不同体系结构之间可能不具有可移植性。
- 正确关闭文件: 始终调用
fclose以确保数据被刷新。
来源
本教程深入探讨了 fwrite 函数,从基本的整数写入到复杂的结构体处理。二进制文件操作是 C 程序中实现高效数据存储和检索的强大工具。
作者
列表 C 标准库。