TOP
|
第10章 对文件的输入输出(六)
anf("%s%d%d%s",stud[i].name,&stud[i].num, &stud[i].age,stud[i].addr); save(); return 0; } |
运行结果:
[例] 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。
(为了验证在磁盘文件stu.dat中是否已存在此数据,可以用以下程序从stu.dat文件中读入数据,然后在屏幕上输出)
#include <stdio.h> #include <stdlib.h> #define SIZE 10 struct Student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; int main() { int i; FILE *fp; if((fp=fopen("stu.dat","rb"))==NULL) //打开输入文件stu.dat { printf("cannot open file\n"); exit(0); } for(i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct Student_type),1,fp); //从fp指向的文件读入一组数据 printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i]. age,stud[i].addr); //在屏幕上输出这组数据 } fclose(fp); //关闭文件stu_list return 0; } |
运行结果:
[例] 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。
(从磁盘文件stu_list中读二进制数据,并存放在stud数组中)
##include <stdio.h> #define SIZE 10 struct Student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; //定义全局结构体数组stud,包含10个学生数据 void load() { FILE *fp; int i; if((fp=fopen("stu_list","rb"))==NULL) //打开输入文件stu_list { printf("cannot open infile\n"); return; } for(i=0;i<SIZE;i++) if(fread(&stud[i],sizeof(struct Student_type),1,fp)!=1) //从stu_ list文件中读数据 { if(feof(fp)) { fclose(fp); return; } printf("file read error\n"); } fclose(fp); } void save() //定义函数save,向文件输出SIZE个学生的数据 { FILE *fp; int i; if((fp=fopen("stu.dat","wb"))==NULL) //打开输出文件stu.dat { printf("cannot open file\n"); return; } for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1) printf("file write error\n"); fclose(fp); } int main() { int i; load(); save(); return 0; } |
总结:
(1) 数据的存储方式 文本方式: 数据以字符方式(ASCII代码)存储到文件中。如整数12,送到文件时占2个字节,而不是4个字节。以文本方式保存的数据便于阅读 二进制方式: 数据按在内存的存储状态原封不动地复制到文件。如整数12,送到文件时和在内存中一样占4个字节 |
(2) 文件的分类 文本文件(ASCII文件): 文件中全部为ASCII字符 二进制文件: 按二进制方式把在内存中的数据复制到文件的,称为二进制文件,即映像文件 |
(3) 文件的打开方式 文本方式: 不带b的方式,读写文件时对换行符进行转换 二进制方式: 带b的方式,读写文件时对换行符不进行转换 |
(4) 文件读写函数 文本读写函数: 用来向文本文件读写字符数据的函数(如fgetc,fgets,fputc,fputs,fscanf,fprintf等) 二进制读写函数: 用来向二进制文件读写二进制数据的函数(如getw,putw,fread,fwrite等) |
10.5 随机读写数据文件
说明: 对文件进行顺序读写比较容易理解,也容易操作,但有时效率不高。而 随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效率高得多。 |
10.5.1 文件位置标记及其定位
1. 文件位置标记
为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记(简称文件位置标记或文件标记),用来指示“接下来要读写的下一个字符的位置”。
说明: 一般情况下,在对字符文件进行顺序读写时,文件位置标记指向文件开头,这时如果对文件进行读/写的操作,就读/写完第1个字符后,文件位置标记顺序向后移一个位置,在下一次执行读/写操作时,就将位置标记指向的第2个字符进行读出或写入。依此类推,直到遇文件尾,,此时文件位置标记在最后一个数据之后。 |
如图所示:
说明: 对流式文件既可以进行顺序读写,也可以进行随机读写。关键在于控制文件的位置标记。如果文件位置标记是按字节位置顺序移动的,就是顺序读写。如果能将文件位置标记按需要移动到任意位置,就可以实现随机读 |
|