重要知识点补充
12 文件操作
12.1 C语言中的文件是什么?
12.2 C语言打开文件
12.3 文本文件和二进制文件到底有什么区别?
12.4 以字符形式读写文件
12.5 以字符串的形式读写文件
12.6 以数据块的形式读写文件
12.7 格式化读写文件
12.8 随机读写文件
12.9 C语言实现文件复制功能
12.10 FILE结构体以及缓冲区深入探讨
12.11 获取文件大小(长度)
12.12 插入、删除、更改文件内容
C语言调试
fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。
对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件,具体原因我们已在《 文本文件和二进制文件到底有什么区别 》一文中进行了说明。
fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为: size_t fread ( void *ptr, size_t size, size_t count, FILE *fp ); fwrite() 函数用来向文件中写入块数据,它的原型为: size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp ); 对参数的说明: ptr 为内存区块的 指针 ,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。 size:表示每个数据块的字节数。 count:表示要读写的数据块的块数。 fp:表示文件指针。 理论上,每次读写 size*count 个字节的数据。 size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
返回值:返回成功读写的块数,也即 count。如果返回值小于 count: 对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。 【示例】从键盘输入一个数组,将数组写入文件再读取出来。 #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, N, fp); //将文件中的位置指针重新定位到文件开头 rewind(fp); //从文件读取内容并保存到数组b fread(b, size, N, fp); //在屏幕上显示数组b的内容 for(i=0; i<N; i++){ printf("%d ", b[i]); printf("\n"); fclose(fp); return 0; 运行结果:
23 409 500 100 222↙
23 409 500 100 222
打开 D:\\demo.txt,发现文件内容根本无法阅读。这是因为我们使用 "rb+" 方式打开文件,数组会原封不动地以二进制形式写入文件,一般无法阅读。
数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是 rewind(fp); 的作用。更多关于rewind函数的内容请点击: C语言rewind函数 。 文件的后缀不一定是 .txt,它可以是任意的,你可以自己命名,例如 demo.ddd、demo.doc、demo.diy 等。 【示例】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。 #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

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。内含一款搜索神器,免费下载全网书籍和视频。

微信扫码关注公众号