C语言fread和fwrite的用法详解(以数据块的形式读写文件)
fgets()函数有"极限性",每次最多只能"文件中读取一行内容",因为fgtes()遇到"换行符"就结束读取。
如果希望读取多行内容,需要使用fread()函数 相应的写入函数为fwirte()
对于 Windows 系统,使用fread()函数和fwrite()函数时应该以"二进制"的形式打开文件。
fread()函数 用来 指定文件中 读取"块数据"。
所谓的"快数据"也就是若干个"字节"的数据,可以是"一个字符"也可以是"一个字符串",可以是"多行数据",并没有什么限制。
fread()函数的原型为:
size_t fread(void *ptr,size_t size,size_t count,FILE *fp);
fwrite()函数用来向文件中"写入" 快数据
它的原型为:
size_fwrite(void *prt,size_t size,size_t count,FILE *fp);
对参数的说明:
1. prt为内存区的"指针",它可以是"数组、变量、结构体"等。
fread()中的ptr用来存放"读取"到的数据,fwrite()中的prt用来存放要"写入"的数据。
2. size:表示每个数据块的"字节数"
3. count:表示要"读写"的数据块的"块数"
4. fp:表示文件指针
5. 理论上,每次读写 size*count个字节的数据
size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
返回值:
返回成功时,返回读写的块数(即count)
如果返回值"小于count":
对于fwrite()函数来说,"肯定"发生了写入错误,可以用ferror()函数检测。
对于fread()函数来说,"可能"读到了"文件末尾",也可能发生了"错误",可以用"ferror()"或"feof()"检测
写个程序加深理解把。
//eg:从键盘输入一个数组,将数组写入文件再读取出来。
#include<stdio.h>
#define N 5
int main()
{
//从键盘输入的数据 放入a ,从文件读取的数据 放入b
int a[N],b[N];
int i,size = sizeof(int);
FILE *fp;
if((fp=fopen("D:\\demo.txt","rb+")) == NULL)
{
puts("Fail to open file!");
exit(0);
}
//从键盘 输入数据 并保存到数组a
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
//将数组a的内存写入到文件
fwrite(a,size,Nfp);
//将文件中的位置指针重新定位到开头
rewind(fp);
//从文件读取内存并保存到数组b
fread(b,size,N,fp);
//在屏幕上显示数组b的内容
for(i=0;i<N;i++)
{
printf("%d",b[i]);
}
printf("\n");
}
结果:
50 444 666 111 580↙
50 444 666 111 580
打开 D:\\demo.txt,发现文件内容根本无法阅读。这是因为我们使用"rb+"方式打开文件,数组会原封不动地以二进制形式写入文件,一般无法阅读。
数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是rewind(fp);的作用。
//eg2从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。
#include<stdio.h>
#define N 2
struct stu{
char name[10]; //姓名
int num; //学号
int age; //年龄
float score; //成绩
}boya[N], boyb[N], *pa, *pb;
int main(){
FILE *fp;
int i;
pa = boya;
pb = boyb;
if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
puts("Fail to open file!");
exit(0);
}
//从键盘输入数据
printf("Input data:\n");
for(i=0; i<N; i++,pa++){
scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score);
}
//将数组 boya 的数据写入文件
fwrite(boya, sizeof(struct stu), N, fp);
//将文件指针重置到文件开头
rewind(fp);
//从文件读取数据并保存到数据 boyb
fread(boyb, sizeof(struct stu), N, fp);
//输出数组 boyb 中的数据
for(i=0; i<N; i++,pb++){
printf("%s %d %d %f\n", pb->name, pb->num, pb->age, pb->score);
}
fclose(fp);
return 0;
}
结果:
Input data:
Tom 2 15 90.5↙
Hua 1 14 99↙
Tom 2 15 90.500000
Hua 1 14 99.000000