第十二章:文件输入/输出-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()函数从文件中读取数据到内存中。
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容