3.9 KiB
C 语言中的fread()函数
原文:https://overiq.com/c-programming-101/fread-function-in-c/
最后更新于 2020 年 7 月 27 日
fread()功能是fwrite()功能的补充。fread()函数常用于读取二进制数据。它接受与fwrite()函数相同的参数。fread()函数的语法如下:
语法: size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
ptr是从文件中读取数据后将存储数据的存储块的起始地址。该函数从文件中读取n项,其中每个项占用第二个参数中指定的字节数。成功后,它从文件中读取n项并返回n。在错误或文件结束时,它返回一个小于n的数字。
让我们举一些例子:
示例 1:从文件中读取浮点值
int val;
fread(&val, sizeof(int), 1, fp);
这将从文件中读取一个float值,并将其存储在变量val中。
例 2:从文件中读取数组
int arr[10];
fread(arr, sizeof(arr), 1, fp);
这将从文件中读取一个10整数数组,并将其存储在变量arr中。
示例 3:读取数组的前 5 个元素
int arr[10];
fread(arr, sizeof(int), 5, fp);
这将从文件中读取5整数,并将其存储在变量arr中。
示例 4:读取数组的前 5 个元素
int arr[10];
fread(arr, sizeof(int), 5, fp);
这将从文件中读取5整数,并将其存储在变量arr中。
例 5:读取结构变量
struct student
{
char name[10];
int roll;
float marks;
};
struct student student_1;
fread(&student_1, sizeof(student_1), 1, fp);
这将从文件中读取结构变量的内容,并将其存储在变量student_1中。
例 6:读取结构的数组
struct student
{
char name[10];
int roll;
float marks;
};
struct student arr_student[100];
fread(&arr_student, sizeof(struct student), 10, fp);
这首先从文件中读取 student 类型的10元素,并将它们存储在变量arr_student中。
下面的程序演示了我们如何使用fread()功能。
#include<stdio.h>
#include<stdlib.h>
struct employee
{
char name[50];
char designation[50];
int age;
float salary
} emp;
int main()
{
FILE *fp;
fp = fopen("employee.txt", "rb");
if(fp == NULL)
{
printf("Error opening file\n");
exit(1);
}
printf("Testing fread() function: \n\n");
while( fread(&emp, sizeof(emp), 1, fp) == 1 )
{
printf("Name: %s \n", emp.name);
printf("Designation: %s \n", emp.designation);
printf("Age: %d \n", emp.age);
printf("Salary: %.2f \n\n", emp.salary);
}
fclose(fp);
return 0;
}
预期输出:
Testing fread() function:
Name: Bob
Designation: Manager
Age: 29
Salary: 34000.00
Name: Jake
Designation: Developer
Age: 34
Salary: 56000.00
工作原理:
在第 4-10 行中,结构雇员和变量emp一起被声明。结构员工有四个成员,即:姓名、职务、年龄和工资。
在第 14 行,声明了类型为struct FILE的结构指针fp。
在第 15 行中,fopen()函数用两个参数调用,即"employee.txt"和"rb"。成功后,它返回一个指向文件employee.txt的指针,并以只读模式打开文件employee.txt。故障时,返回NULL。
第 17-21 行,if 语句用于测试fp的值。如果是NULL,printf()语句打印错误信息,程序终止。否则,程序继续执行 if 语句后面的语句。
在第 25-31 行中,while 循环与fread()一起用于读取文件的内容。fread()函数逐个读取存储在文件中的记录,并将其存储在结构变量emp中。fread()功能会一直返回 1,直到文件中有记录为止。一旦遇到文件的结尾fread()将返回一个小于 1 的值,while 循环中的条件变为假,控制从 while 循环中出来。
第 33 行,fclose()功能用于关闭文件。