第十二章:文件输入/输出-6用fread()读二进制数据

C fread

目标

在本文章中,您将学习如何使用C fread()函数将数据从文件中读入内存。

介绍C的fread()函数

fread()函数在stdio.h标准库中定义。函数的作用是:将文件中的数据读取到内存中。它的语法如下:

size_t fread (void * pstr, size_t size, size_t count, FILE * stream);

fread()函数有以下参数:

  • pstr是一个指向缓冲区的指针,fread()函数将在其中存储数据。
  • size是函数将读取的每个元素的字节大小。
  • count是函数将从文件中读取的元素的数量。
  • stream是一个文件指针,函数将从中读取数据。
    函数的作用是:返回许多成功从文件中读取的元素。它等于count。

如果返回值小于count,有两种可能的情况:

  • 函数遇到文件结束符。
  • 或读取文件时发生错误。
    如果size或count为零,fread()函数将返回零。

C fread()函数的例子

假设您有包含10个整数的numbers.dat文件。下面的示例使用fread()函数从numbers.dat文件中读取所有数字。

注意,如果您没有numbers.dat文件,您可以从fwrite()函数文章中运行程序来创建它。

#include <stdio.h>

int main()
{
    // 打开用于写二进制的文件
    char *filename = "numbers.dat";
    FILE *fp = fopen(filename, "rb");
    if (fp == NULL)
    {
        printf("打开%s文件错误", filename);
        return -1;
    }
    // 从文件中读数
    int n;
    for (int i = 0; i < 10; i++)
    {
        fread(&n, sizeof(int), 1, fp);
        printf("%d ", n);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

它是如何执行的。

首先,打开numbers.dat文件读取二进制数据(模式为rb)

char *filename = "number.dat";
FILE *fp = fopen(filename, "rb");
if (fp == NULL) = NULL
{
    printf("错误打开文件%s",filename);
    return 1;
}

其次,使用fread()函数一次读取每个数字到变量n,并立即显示到屏幕上:

int n;
for (int i = 0;i< 10;i++)
{
    fread (&n, sizeof(int), 1, fp);
    printf (" % d”,n);
}

第三,读取后关闭文件:

//关闭文件
fclose(fp);

一个实用的C fread()函数示例

在fwrite()函数文章中,您还学习了如何将库存数据写入inventory.dat文件。库存记录的结构体如下:

typedef struct
{
    char name[40];
    unsigned qty;
}product;

在这个例子中,你将学习如何使用fread()函数来读取库存数据并将其显示在屏幕上:

首先,在程序的main()函数中定义逻辑:

#include <stdio.h>
#include <stdbool.h>

typedef struct
{
    char name[40];
    unsigned qty;
} product;

int main()
{
    // 读取产品
    const int SIZE = 2;
    product product_list[SIZE];

    // 保存到文件
    read(product_list, SIZE, "inventory.dat");

    // 显示产品列表
    display(product_list, SIZE);

    return 0;
}

程序重新定义了product结构体:

typedef struct
{
    char name[40];
    unsigned qty;
} product;

然后调用read()函数从文件中读取数据到数组中,并调用display()函数显示库存信息。

其次,定义read()函数,该函数将库存从文件中读取到数组中:

bool read(product *product_list, const int size, const char *filename);

下面是read()函数的定义:

bool read(product *product_list, const int size, const char *filename);

下面显示了read()函数的定义:

bool read(product *product_list, const int size, const char *filename)
{
    FILE *fp = fopen(filename, "rb");
    if (fp == NULL)
    {
        puts("Error opening the file");
        return false;
    }

    for (int i = 0; i < size; i++)
        fread(&product_list[i], sizeof(product), 1, fp);

    fclose(fp);

    return true;
}

read()函数做三件事:打开文件,将文件中的数据读入product_list数组,并关闭文件。

第三,定义一个在屏幕上显示库存数据的函数:

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 read(product *product_list, const int size, const char *filename);
void display(product *product_list, const int size);

int main()
{
    
    const int SIZE = 2;
    product product_list[SIZE];

    // 保存到文件
    read(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 read(product *product_list, const int size, const char *filename)
{
    FILE *fp = fopen(filename, "rb");
    if (fp == NULL)
    {
        puts("打开文件错误");
        return false;
    }

    for (int i = 0; i < size; i++)
        fread(&product_list[i], sizeof(product), 1, fp);

    fclose(fp);

    return true;
}

总结

  • 使用C fread()函数从文件中读取数据到内存中。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容