C fwrite
目标
在本文章中,您将学习如何使用C fwrite函数来创建一个随机访问文件。
介绍C语言的fwrite()函数
fwrite()函数在stdio.h库中定义。函数的作用是:将数据写入二进制文件。
下面是fwrite()函数的语法:
fwrite (const void * ptr, size_t size, size_t count, FILE * stream);
函数的作用是:将内存中的数据块写入文件。它有以下参数:
- ptr是一个指针,它指向内存中要写入文件的数据块。通常,它是一个指向数据数组的指针。
- size指定函数将写入文件的每个元素的字节数。
- count指定函数将写入文件的元素数量。
- stream是指向函数要写入的文件的文件指针。
函数的作用是:返回函数成功写入文件的元素个数。
一个简单的C fwrite()函数示例
下面的示例使用fwrite()函数将从0到9的数字写入文件:
#include <stdio.h>
int main()
{
char *filename = "numbers.dat";
// 打开用于写二进制的文件
FILE *fp = fopen(filename, "wb");
if (fp == NULL)
{
printf("错误: 打开文件 %s", filename);
return -1;
}
// 向文件写数字
for (int i = 0; i < 10; i++)
fwrite(&i, sizeof(int), 1, fp);
// 关闭文件
fclose(fp);
return 0;
}
它是如何执行的。
首先,使用fopen()函数打开文件numbers.dat。fopen()使用wb模式将二进制数据写入文件。如果文件不存在,它将创建一个新文件。但是,如果文件已经存在,它将覆盖文件的内容。
// 打开用于写二进制的文件
FILE *fp = fopen(filename, "wb");
if (fp == NULL)
{
printf("错误: 打开文件 %s", filename);
return -1;
}
其次,从0迭代到9,并使用fwrite()函数将每个数字写入文件:
for (int i = 0; i < 10; i++)
fwrite(&i, sizeof(int), 1, fp);
下面的语句将一个整数写入文件:
fwrite(&i, sizeof(int), 1, fp);
第三,使用fclose()函数关闭文件:
// 关闭文件
fclose(fp);
一个实用的C fwrite()函数示例
假设您需要将库存数据写入文件。库存包括一份记录清单,其中每条记录包含以下信息:
- 产品名称
- 数量
首先,定义一个包含产品名称和数量的结构体:
typedef struct
{
char name[40];
unsigned qty;
}product;
第二,定义一个函数,允许用户输入多个产品:
bool input(product *product_list, const int size);
input()函数的定义如下:
bool input(product *product_list, const int size)
{
int i = 0;
do
{
printf("名称:");
scanf("%s", &product_list[i].name);
printf("数量:");
scanf("%d", &product_list[i].qty);
i++;
} while (i < size);
}
第三,定义一个函数,将记录保存到filename指定的文件中:
bool save(product *product_list, const char *filename);
save()函数的定义如下:
bool save(product *product_list, const int size, const char *filename)
{
// 写清单到文件
FILE *fp = fopen(filename, "wb");
if (fp == NULL)
{
puts("错误打开文件");
return false;
}
for (int i = 0; i < size; i++)
fwrite(&product_list[i], sizeof(product), 1, fp);
fclose(fp);
return true;
}
save()函数做三件事:打开文件,将产品列表中的每个结构体写到文件中,并关闭它。
最后,定义一个函数来显示输入的清单:
void display(product *product_list, const int size)
display()函数的逻辑如下:
void display(product *product_list, const int size)
{
// 显示产品列表
puts("名称\t数量");
puts("-------------");
for (int i = 0; i < size; i++)
printf("%s \t %d\n", product_list[i].name, product_list[i].qty);
}
放在一起:
#include <stdio.h>
#include <stdbool.h>
typedef struct
{
char name[40];
unsigned qty;
} product;
bool input(product *product_list, const int size);
bool save(product *product_list, const int size, const char *filename);
void display(product *product_list, const int size);
int main()
{
const int SIZE = 10;
product product_list[SIZE];
// 输入产品列表
input(product_list, SIZE);
// 保存到文件
save(product_list, SIZE, "inventory.dat");
// 显示产品列表
display(product_list, SIZE);
return 0;
}
void display(product *product_list, const int size)
{
// 显示产品列表
puts("名称\t数量");
puts("-------------");
for (int i = 0; i < size; i++)
printf("%s \t %d\n", product_list[i].name, product_list[i].qty);
}
// 保存产品列表到文件
bool save(product *product_list, const int size, const char *filename)
{
// 写清单到文件
FILE *fp = fopen(filename, "w");
if (fp == NULL)
{
puts("错误打开文件");
return false;
}
for (int i = 0; i < size; i++)
fwrite(&product_list[i], sizeof(product), 1, fp);
fclose(fp);
return true;
}
// 输入清单数据
bool input(product *product_list, const int size)
{
int i = 0;
do
{
printf("名称:");
scanf("%s", &product_list[i].name);
printf("数量:");
scanf("%d", &product_list[i].qty);
i++;
} while (i < size);
}
请注意,SIZE常量定义了用户每次输入的产品数量。
总结
- 使用C fwrite()函数将内存中的数据块写入文件。