C语言fread()和fwrite():以数据块的形式读写文件(附带实例)
C语言中,fputc() 和 fgetc() 函数每次只能处理文件中的一个字符,但是在编写程序的过程中往往需要对整块数据进行读写,例如对一个结构体变量值进行读写。本节介绍实现整块数据读和写的 fread() 和 fwrite() 函数。
fread() 函数的一般形式如下:
fwrite() 函数的一般形式如下:
有以下几点说明:
例如:
【实例】实现将录入的通信录信息保存到磁盘文件中,在录入完信息后,将全部信息输出。具体代码如下:
fread() 函数的一般形式如下:
fread(buffer,size,count,fp);该函数的作用是从 fp 所指向的文件中读入 count 次,每次读 size 字节,读入的信息存在 buffer 地址中。如果调用 fread() 函数成功,则函数返回值等于 count 的值。
fwrite() 函数的一般形式如下:
fwrite(buffer,size,count,fp);该函数的作用是将以 buffer 地址开始的信息输出 count 次,每次写 size 字节到 fp 所指向的文件中。如果调用 fwrite() 函数成功,则函数返回值等于 count 的值。
有以下几点说明:
- buffer:指针。对于 fwrite() 函数来说,其指向的是要输出数据的地址(起始地址);对 fread() 函数来说,其指向的是所要读入的数据的存放地址;
- size:要读写的字节数;
- count:要读写多少次 size 字节的数据项;
- fp:文件指针。
例如:
fread(a,2,3,fp);上述代码的含义是从 fp 所指向的文件中每次读两个字节输入数组 a,连续读 3 次。
fwrite(a,2,3,fp);上述代码的含义是将 a 数组中的信息每次输出两个字节到 fp 所指向的文件中,连续输出 3 次。
【实例】实现将录入的通信录信息保存到磁盘文件中,在录入完信息后,将全部信息输出。具体代码如下:
#define _CRT_SECURE_NO_WARNINGS /*解除vs安全性检测问题*/ #include <stdio.h> #include <process.h> struct address_list /*定义结构体存储信息*/ { char name[10]; char adr[20]; char tel[15]; } info[100]; void save(char* name, int n) /*自定义save()函数*/ { FILE* fp; /*定义一个指向FILE类型结构体的指针变量*/ int i; if ((fp = fopen(name, "wb")) == NULL) /*以只写方式打开指定文件*/ { printf("cannot open file\n"); exit(0); } for (i = 0; i < n; i++) /*将一组数据输出到fp所指向的文件中*/ if (fwrite(&info[i], sizeof(struct address_list), 1, fp) != 1) printf("file write error\n");/*如果写入文件不成功,则输出错误信息*/ fclose(fp); /*关闭文件*/ } void show(char* name, int n) /*自定义show()函数*/ { int i; FILE* fp; /*定义一个指向FILE类型结构体的指针变量*/ if ((fp = fopen(name, "rb")) == NULL) /*以只读方式打开指定文件*/ { printf("cannot open file\n"); exit(0); } for (i = 0; i < n; i++) { /*从fp所指向的文件读入数据存到info数组中*/ fread(&info[i], sizeof(struct address_list), 1, fp); printf("%15s%20s%20s\n", info[i].name, info[i].adr,info[i].tel); } fclose(fp); /*关闭文件*/ } int main() { int i, n; /*变量类型为基本整型*/ char filename[50]; /*数组为字符型*/ printf("how many ?\n"); scanf("%d", &n); /*输入存入通信录信息的数量*/ printf("please input filename:\n"); scanf("%s", filename); /*输入文件名称*/ printf("please input name,address,telephone:\n"); for (i = 0; i < n; i++) /*输入信息*/ { printf("NO%d", i + 1); scanf("%s%s%s", info[i].name, info[i].adr, info[i].tel); save(filename, n); /*调用函数save()*/ } show(filename, n); /*调用函数show()*/ }程序运行结果为:
how many ? 2 please input filename: D:\demo.txt please input name,address,telephone: NO1 zhangsan hebei 123456789 NO2 lisi beijing 123123123 zhangsan hebei 123456789 lisi beijing 123123123