文件的随机读写
文件的随机读写
定义:读写操作时,不按照数据在文件中先后次序依次读写,而是可以对文件中任意位置的数据进行访问,在读写文件中特定数据时效率较高。
10.4.1 文件位置标记
为对文件读写的数据进行控制,系统为每个文件设置一个文件读写位置标记(简称文件位置标记),指示“要读写的下一个数据的位置”。
文件位置标记的定位
文件位置标记的定位
(1)void rewind(FILE *fp)
把fp指向文件的文件位置标记定位到文件的开头位置,并清除文件结束标记和错误标记。
(2) int fseek(FILE *fp, long offset, int base)
把fp指向文件位置标记移动到以base给出的位置为基准,以offset给出的数值为偏移量的位置。定位成功,函数返回定位的位置,否则文件读写位置不变,返回非0值。
几个fseek函数应用的例子:
fseek(fp, 10L, CUR_SET); //文件头开始,向文件尾方向偏移10个字节
fseek(fp, 10L, CUR_CUR); //当前位置开始,向文件尾方向偏移10个字节
fseek(fp, -10L, CUR_END); //文件尾开始,向文件头方向偏移10个字节
(3) long ftell(FILE *fp):返回fp所指向文件的文件位置标记的值。
(4) int feof(FILE *fp):检查文件是否结束。结束返回非0值,否则返回0。
例:在二进制文件integer.dat中存放有若干个整数,计算文件中奇数位置(第1、3、5、…)上的整数的和。
参考代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=, sum=, n;
FILE *fp;
if((fp=fopen("integer.dat", "rb")) == NULL)
{
printf("文件打开失败!\n");
exit();
}
while(fread(&n, sizeof(int), , fp)>)
{
printf("i=%d, n=%d\n", i, n);
sum = sum+n;
fseek(fp, sizeof(int), SEEK_CUR); //跳过下一个整数
}
fclose(fp);
printf("sum=%d\n", sum);
return ;
}