函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
头文件:stdio.h
功能:以数据块的方式从文件中读取相应的内容。
参数:
ptr:存放读取出来的数据。
size:指定读取文件内容的块数据大小,类型size_t为unsigned int类型。
nmemb:指定读取文件的块数。
stream:已经打开的文件指针。
这里读取的文件数据总大小为 size*nmemb。返回值:失败返回0,成功则返回实际读取到的文件内容的块数。
源码如下:
#include <stdio.h>
typedef struct _Student {
int age;
char buf[50];
int score;
} Student;
int file_write(void)
{
FILE *fp = NULL;
fp = fopen("Fwrite_Fread.txt", "w");
if(fp == NULL)
{
perror("file_write fopen");
return -1;
}
Student std[3] = {
{20, "alo", 80},
{24, "blo", 85},
{27, "clo", 90}
};
fwrite(std, sizeof(Student), 3, fp);
fclose(fp);
fp = NULL;
return 0;
}
int file_read(void)
{
FILE *fp = NULL;
fp = fopen("Fwrite_Fread.txt", "r");
if(fp == NULL)
{
perror("file_read fopen");
return -1;
}
Student std[10];
int len = 0;
len = fread(std, sizeof(Student), 2, fp);
printf("fread_return = %d\n", len);
for(int i = 0; i < 3; i++)
{
printf("%d %s %d\n", std[i].age, std[i].buf, std[i].score);
}
fclose(fp);
fp = NULL;
}
int main(int argc, char *argv[])
{
file_write();
file_read();
return 0;
}
① 当指定大小为 fread(std, sizeof(Student), 2, fp);
这里Fwrite_Fread.txt文件内有3个结构体类型大小即3*sizeof(Student),而指定的读取文件大小为2*sizeof(Student)是小于文件内的总大小3*sizeof(Student)的,所以fread()返回值为指定的块数目,即 fread_return = 2。
因为指定的是2*sizeof(Student)大小,所以只读取到前两个结构体的数据,第三个没有读取到,结果如下:
20 alo 80
24 blo 85
0 1962291840
② 当指定大小为 fread(std, sizeof(Student), 10, fp);
这里Fwrite_Fread.txt文件内有3个结构体类型大小即3*sizeof(Student),而指定的读取文件大小为10*sizeof(Student)是大于文件内的总大小3*sizeof(Student)的,所以fread()返回值为实际读取的块数目,即 fread_return = 3。
因为指定的是10*sizeof(Student)大小,所以可以读取到三个结构体的数据,结果如下:
20 alo 80
24 blo 85
27 clo 90
③ 当指定大小为 fread(std, sizeof(std), 10, fp);
这里Fwrite_Fread.txt文件内有3个结构体类型大小即3*sizeof(Student),而指定的读取文件大小为10*sizeof(std)是大于文件内的总大小3*sizeof(Student)的,但是一个数据块的大小为sizeof(std)=10*60=600Byte的,文件里面的大小为3*sizeof(Student)=180Byte的,所以读取到的内容是没有装满一个数据块的,fread()返回值为0,即 fread_return = 0。
但是内容是有读取到并被保存的,结果如下:
20 alo 80
24 blo 85
27 clo 90
④ 当指定大小为 fread(std, 1, sizeof(std), fp);
这里如果把块大小指定为1的话,那么返回值即读取文件的总大小sizeof(std)即180Byte,结果如下:
20 alo 80
24 blo 85
27 clo 90