5.9 KiB
C 中的fwrite()函数
原文:https://overiq.com/c-programming-101/fwrite-function-in-c/
最后更新于 2020 年 7 月 27 日
二进制输入和输出
到目前为止,我们一直使用文本模式来读写文件中的数据。在本章中,我们将学习如何使用二进制模式在文件中读写数据。回想一下,在二进制模式下,数据存储在文件中的方式与存储在内存中的方式相同,因此在二进制模式下不会发生数据转换。由于没有转换发生,二进制模式比文本模式快得多。
[img]
fread()和fwrite()函数通常分别用于向文件读写二进制数据。虽然我们也可以在文本模式下使用它们。
先说fwrite()功能。
fwrite()函数
语法: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
fwrite()函数将 void 指针ptr指定的数据写入文件。
ptr:指向包含待写数据项的内存块。
size:指定每个要写入的项目的字节数。
n:是要写的项目数。
fp:是指向将要写入数据项的文件的指针。
成功时,它返回成功写入文件的项目数。出错时,它返回一个小于n的数字。注意两个参数(size、n)和fwrite()的返回值属于size_t类型,在大多数系统上是unsigned int。
为了更好地理解fwrite()函数,请考虑以下示例:
例 1:写变量
float *f = 100.13;
fwrite(&p, sizeof(f), 1, fp);
这会将变量f的值写入文件。
例 2:写数组
int arr[3] = {101, 203, 303};
fwrite(arr, sizeof(arr), 1, fp);
这会将整个数组写入文件。
例 3:写数组的一些元素
int arr[3] = {101, 203, 303};
fwrite(arr, sizeof(int), 2, fp);
这只会将数组的前两个元素写入文件。
例 4:书写结构
struct student
{
char name[10];
int roll;
float marks;
};
struct student student_1 = {"Tina", 12, 88.123};
fwrite(&student_1, sizeof(student_1), 1, fp);
这会将变量student_1的内容写入文件。
例 5:写入结构数组
struct student
{
char name[10];
int roll;
float marks;
};
struct student students[3] = {
{"Tina", 12, 88.123},
{"Jack", 34, 71.182},
{"May", 12, 93.713}
};
fwrite(students, sizeof(students), 1, fp);
这会将整个数组的学生写入文件。
假设我们不想将数组的所有元素都写入文件,而是只将数组的第 0 个和第 1 个元素写入文件。
fwrite(students, sizeof(struct student), 2, fp);
现在你已经明白fwrite()函数是如何工作的了。让我们使用fwrite()功能创建一个程序。
下面的程序演示了如何使用fwrite()功能。
#include<stdio.h>
#include<stdlib.h>
struct employee
{
char name[50];
char designation[50];
int age;
float salary
} employee;
int main()
{
int n, i, chars;
FILE *fp;
fp = fopen("employee.txt", "wb");
if(fp == NULL)
{
printf("Error opening file\n");
exit(1);
}
printf("Testing fwrite() function: \n\n");
printf("Enter the number of records you want to enter: ");
scanf("%d", &n);
for(i = 0; i < n; i++)
{
printf("\nEnter details of employee %d \n", i + 1);
fflush(stdin);
printf("Name: ");
gets(employee.name);
printf("Designation: ");
gets(employee.designation);
printf("Age: ");
scanf("%d", &employee.age);
printf("Salary: ");
scanf("%f", &employee.salary);
chars = fwrite(&employee, sizeof(employee), 1, fp);
printf("Number of items written to the file: %d\n", chars);
}
fclose(fp);
return 0;
}
预期输出:
Testing fwrite() function:
Enter the number of records you want to enter: 2
Enter details of employee 1
Name: Bob
Designation: Manager
Age: 29
Salary: 34000
Number of items written to the file: 1
Enter details of employee 2
Name: Jake
Designation: Developer
Age: 34
Salary: 56000
Number of items written to the file: 1
工作原理:
在第 4-10 行中,声明了一个结构雇员,它有四个成员,即名称是一个字符数组,名称也是一个字符数组,年龄是 int 类型,工资是 float 类型。除了结构定义,还声明了一个类型为 struct employee 的变量 emp。
在第 14 行,三个变量 n、I 和 chars 被声明为 int 类型。
在第 15 行,声明了一个 struct FILE 类型的结构指针 fp。
在第 17 行,fopen()函数用两个参数调用,即“employee.txt”和“wb”。成功后,它返回一个指向文件 employee.txt 的指针,并以只写模式打开文件 employee.txt。失败时,它返回空值。
在第 19-23 行,if 语句用于测试 fp 的值。如果为空,printf()语句将打印错误消息,程序终止。否则,程序继续执行 if 语句后面的语句。
在第 27-28 行,程序询问用户他/她想要输入多少条记录,并将数字存储在变量 n 中。
在第 30-50 行,for 循环中的语句要求用户输入四条信息,即姓名、职务、年龄和工资。请注意,在第 34 行中,调用 fflush()函数来刷新(删除)在第 28 行输入记录数时输入的标准输入中的换行符。如果没有对 fflush(stdin)的调用,那么第 37 行中的 get()函数将从标准输入中读取换行符,而不等待用户输入。在第 48 行,调用 fwrite()函数以二进制模式将结构变量 emp 写入文件。我们已经知道,在成功时,fwrite()返回写入文件的项目数。这里我们写的是单个结构变量的数据,所以 fwrite()将返回 1。出错时,它将返回一个小于 1 的数字。然后,fwrite()的返回值被赋给 chars 变量。在第 49 行,printf()语句打印成功写入文件的项目数。
第 52 行,fclose()功能用于关闭文件。