geekdoc-python-zh/docs/overiq/087.md

3.9 KiB
Raw Permalink Blame History

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的值。如果是NULLprintf()语句打印错误信息,程序终止。否则,程序继续执行 if 语句后面的语句。

在第 25-31 行中while 循环与fread()一起用于读取文件的内容。fread()函数逐个读取存储在文件中的记录,并将其存储在结构变量emp中。fread()功能会一直返回 1直到文件中有记录为止。一旦遇到文件的结尾fread()将返回一个小于 1 的值while 循环中的条件变为假,控制从 while 循环中出来。

第 33 行,fclose()功能用于关闭文件。