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()函数从文件中读取数据到内存中。