C语言fread()和fwrite()函数的用法(附带实例)
前面介绍了很多 C 语言读写文件的函数,它们的读写方式适用于读写文本文件,例如:
这些读写形式一次只能读写一个数据。在现实中,一个文件包含多组数据,不可能一个一个读写,因此,接下来介绍以数据块的形式读取二进制文件。
用 fread() 函数读取二进制文件是读数据,直接将数据复制出来,没有转换。读的过程中没有什么限制,操作对象可以是一个字符,也可以是一个字符串,还可以是一串数据,不受换行的影响。
fread() 函数的语法如下:
它对应的写入函数为 fwrite(),fwrite() 函数的语法如下:
【实例】创建一个学生成绩二进制文件,然后用数据块的形式读取文件,并显示出来。代码如下:
上述例子读文件和写文件用到了不同的方法,如果将它们互换,如下:
- fgetc()/fputc() 以字符形式读写,一次读写一个字符;
- fgets()/fputs() 以字符串形式读写,一次读写一个字符串;
- fscanf()/fprintf() 以格式化形式读写,一次读写一个数据。
这些读写形式一次只能读写一个数据。在现实中,一个文件包含多组数据,不可能一个一个读写,因此,接下来介绍以数据块的形式读取二进制文件。
用 fread() 函数读取二进制文件是读数据,直接将数据复制出来,没有转换。读的过程中没有什么限制,操作对象可以是一个字符,也可以是一个字符串,还可以是一串数据,不受换行的影响。
fread() 函数的语法如下:
fread(ptr, size, count, fp);参数说明如下:
- ptr:存储读取的文件数据的地址;
- size:数据块的字节数;
- count:数据块的个数;
- fp:文件指针。
它对应的写入函数为 fwrite(),fwrite() 函数的语法如下:
fwrite(ptr,size,count,fp);参数说明如下:
- ptr:要写入的数据的地址;
- 参数 size、count、fp 的作用跟 fread() 函数的一样。
【实例】创建一个学生成绩二进制文件,然后用数据块的形式读取文件,并显示出来。代码如下:
#include <stdio.h> #include <stdlib.h> #define FILESTR "E:\c.dat" //定义文件路径 #define STU_NUM 2 //学生数 struct stu{ char name[10]; //学生名称 int num; //学生学号 float Chinese,math,English; }; int main() { FILE *fp; struct stu stu1[STU_NUM],stu[STU_NUM]={{"Liao",1,97,86,86},{"Tang",2,86,96,86}}; int i; if((fp=fopen(FILESTR,"wb+"))==NULL) { printf("error: cannot open file!\n"); exit(0); } //用二进制读写形式创建文件 fwrite(stu, sizeof(struct stu), 5, fp); //将stu中的数据写入文件 rewind(fp); //将文件指针重置到文件开头 for(i=0;i<STU_NUM;i++) { fread(&stu1[i], sizeof(struct stu), 1, fp); //将文件的数据进str1中 } for(i=0;i<STU_NUM;i++) { printf("%s %d %f %f %f",stu1[i].name, stu1[i].num,stu1[i].Chinese,stu1[i].math,stu1[i].English); printf("\n"); } fclose(fp); return 0; }编译运行,结果如下:
Liao 1 97 86 86
Tang 2 86 96 86
上述例子读文件和写文件用到了不同的方法,如果将它们互换,如下:
fwrite(stu1, sizeof(struct stu), 5, fp);和下面的语句效果一样:
for(i=0;i<5;i++) { fwrite(&stu1[i], sizeof(struct stu), 1, fp); }注意,用数据块形式写的二进制文件不像文本文件一样可以打开查看,二进制文件如果直接用记事本程序打开是乱码。