第10章 对文件的输入输出(七)
写。所谓随机读写,是指读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。即对文件读写数据的顺序和数据在文件中的物理顺序一般是不一致的。可以在任何位置写入数据,在任何位置读取数据。 |
2. 文件位置标记的定位
(1) 用rewind函数使文件位置标记指向文件开头 rewind函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值。 形式: rewind(文件指针); |
(2) 用fseek函数改变文件位置标记 fseek函数一般用于二进制文件。 形式: fseek(文件类型指针, 位移量, 起始点); 说明: “起始点”:用0,1或2代替,0代表“文件开始位置”,1为“当前位置”,2为“文件末尾位置” “位移量”:指以“起始点”为基点,向前移动的字节数(长整型) 使用方式为: fseek (fp,100L,0); //将文件位置标记向前移到离文件开头100个字节处 fseek (fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处 fseek (fp,-10L,2); //将文件位置标记从文件末尾处向后退10个字节 |
(3) 用ftell函数测定文件位置标记的当前位置 ftell函数的作用是得到流式文件中文件位置标记的当前位置,用相对于文件开头的位移量来表示。如果调用函数时出错(如不存在fp指向的文件),ftell函数返回值为-1L。 使用方式: i=ftell(fp); //变量i存放文件当前位置 if(i==-1L) printf(″error\n″); //如果调用函数时出错,输出″error″ |
[例] 有一个磁盘文件,内有一些信息,要求第1次将它的内容显示在屏幕上,第2次把它复制到另一文件上
#include<stdio.h> int main() { char ch; FILE *fp1,*fp2; fp1=fopen("file1.dat","r"); //打开输入文件 fp2=fopen("file2.dat","w"); //打开输出文件 ch=getc(fp1); //从file1.dat文件读入第一个字符 while(!feof(fp1)) //当未读取文件尾标志 { putchar(ch); //在屏幕输出一个字符 ch=getc(fp1); //再从file1.dat文件读入一个字符 } putchar(10); //在屏幕执行换行 rewind(fp1); //使文件位置标记返回文件开头 ch=getc(fp1); //从file1.dat文件读入第一个字符 while(!feof(fp1)) //当未读取文件尾标志 { fputc(ch,fp2); //向file2.dat文件输出一个字符 ch=fgetc(fp1); //再从file1.dat文件读入一个字符 } fclose(fp1);fclose(fp2); return 0; } |
运行结果:
10.4.2 随机读写
[例] 在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。
提示:使用rewind和fseek函数
#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 文件读写的出错检测
C提供一些函数用来检查输入输出函数调用时可能出现的错误。
1. ferror函数
它的一般调用形式为: ferror(fp); |
说明: 在调用各种输入输出函数(如putc,getc,fread,fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 如果ferror返回值为0(假),表示未出错;如果返回一个非零值,表示出错。 |
2. clearerr函数
说明: clearerr的作用是使文件出错标志和文件结束标志置为0。 假设在调用一个输入输出函数时出现错误,ferror函数值为一个非零值。应该立即调用clearerr(fp),使ferror(fp)的值变成0,以便再进行下一次的检测。 只要出现文件读写出错标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。 |
注:对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢 |