10.4随机读写数据文件
实际应用中,对于大批量的数据,如果想找到其中某一个人的数据。(假设整个人的数据在最后一个)按照顺寻读写,要读完前面所有数据,才能开始读写这个数据。造成的时间浪费是不可忍受的。
所以引入随机读写数据的概念。
10.4.1文件位置标记及其定位
a.文件位置标记就是:读写下一个字符的位置。
当开始读写文件的时候,文件位置标记指向第一个位置。
当输入第一个文件的数据时。此时位置标记往后面顺推一个位置,指向第二个位置…
所谓文件标记位置就是下面那个你想要输入的字符输入的位置。
再看
顺序读写:文件位置标记按字节位置顺序移动的读写方式
随机读写:文件标记位置按需要移动到任意位置读写的方式
流式文件:既可以顺序读写,也可以随机读写
b. 文件位置标记的定位:
1)用rewind函数使文件位置标记指向文件开头。无返回值
2)用fseek函数改变文件标记的位置
fseek(文件指针类型,位移量,起始点); 文件指针:指向某个文件 位移量:以起始点为基准,向前移动的字节数,位移量是long型数据(末尾加一个L,就代表long型数据) 起始点:用0,1,2代替。 fseek(fp,100L,0);将文件标记向前移动到离文件开头100个字节处。 fseek(fp,50L,1);将文件标记向前移动到离当前位置50个字节处 fseek(fp,-10L,2);将文件标记位置从文件末尾处向后退10个字节
3)用ftell函数测定文件的当前位置
从流式文件中得到标记的当前位置; 用相对于文件开头的位移量来表示; 调用出错返回-1L i=ftell(fp); if(i==-1L) printf("error\n");
10.4.2 随机读写(实例)
例子:有一个磁盘文件,内有一些信息。要求第一次将他的内容显示在屏幕上,第二次把他复制到另一个文件中上。
#include <stdio.h> int main(int argc, char const *argv[]) { FILE *fp1 ,*fp2; fp1=fopen("file1.dat","r"); fp2=fopen("file2.dat","w"); while (!feof(fp1)) putchar(getc(fp1)); putchar(10); rewind(fp1); while (!feof(fp1)) putc(getc(fp2)); fclose(fp1); fclose(fp2); return 0; }
例子:在磁盘文件中存有是个学生数据。要求将第1,3,5,7,9个数据输入计算机,并且在屏幕上显示出来。
#include <stdio.h> #include <stdlib.h> struct student_type { char name[10]; int num; int age; char addr[15]; } stud[10]; int main() { int i; FILE *fp; if((fp=fopen("stu.dat","rb"))==NULL) { printf("can not open file\n"); exit(0); } for(i=0;i<10;i+=2) { fseek(fp,i*sizeof(struct student_type),0); fread(&stud[i],sizeof(struct student_type),1,fp); printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr); } fclose(fp); return 0; }
10.5 文件读写的出错检测
调用某一个函数如果正确,会返回一个数值。同理,如果错误,也会返回一个数值。所以对调用函数,可以通过返回值来判断函数的正确与否。
但是除了这个还可以通过特定 函数来检查。
1.ferror ----注意是针对 文件的输入输出函数
ferror(fp); 返回0:没有出错 返回非零:出错 fp:输入输出函数中所指向的文件地址。
通过对文件结果是否出现错误来判断函数是否执行。
当打开一个文件时候,这个ferror值自动调为0,以后每次对文件操作,ferror的数值都会进行改变。
2.clearerr
每次出现错误,ferror的数值都使一个非0的数值。此时要把这个数值调为0,才能使用ferror再次去判断。使文件错误标志还有文件结束标志调为0.