C语言rewind()和fseek()随机读写文件的用法(附带实例)
在 C 语言程序中,通常文件读写方式都是先打开文件,然后从文件的开头开始读写。
如果想要读写文件中间或者文件后面的数据,从文件开头开始读写不但浪费内存,而且效率很低。因此,下面运用 rewind() 和 fseek() 函数对文件进行随机读写操作。
rewind() 函数的作用是使文件指针指向文件开头。其语法如下:
fseek() 函数的作用是使文件指针指向任意位置,fseek()函数的语法如下:
起始位置可以是文件开头位置,可以是文件当前位置,也可以是文件结尾位置。C语言中对这 3 个位置的命名和代表符号如下表所示。
下面举几个例子说明 fseek() 函数的用法,代码如下:
【实例】导出排名第二的学生的信息,并显示出来。代码如下:
编译运行程序,结果如下:
如果想要读写文件中间或者文件后面的数据,从文件开头开始读写不但浪费内存,而且效率很低。因此,下面运用 rewind() 和 fseek() 函数对文件进行随机读写操作。
rewind() 函数的作用是使文件指针指向文件开头。其语法如下:
rewind(fp); //fp为文件指针
fseek() 函数的作用是使文件指针指向任意位置,fseek()函数的语法如下:
fseek(文件指针,位移的字节数,起始位置);位移的字节数可以是正数,也可以是负数,正数表示向前移动,负数表示向后移动。
起始位置可以是文件开头位置,可以是文件当前位置,也可以是文件结尾位置。C语言中对这 3 个位置的命名和代表符号如下表所示。
起始位置 | 位置命名 | 代表符号 |
---|---|---|
文件开头位置 | SEEK_SET | 0 |
文件当前位置 | SEEK_CUR | 1 |
文件结尾位置 | SEEK_END | 2 |
下面举几个例子说明 fseek() 函数的用法,代码如下:
fseek(fp,10,0); //将文件指针向前移到离文件开头位置10个字节处 fseek(fp,10,1); //将文件指针向前移到离文件当前位置10个字节处 fseek(fp,-20,1); //将文件指针向后移到离文件当前位置20个字节处 fseek(fp,-50,2); //将文件指针向后移到离文件结尾位置50个字节处注意,fseek() 函数一般用于二进制文件,在文本文件中使用容易出错,因为文本文件需要进行字符转换,在计算字节数时不一定跟预想的一样。
【实例】导出排名第二的学生的信息,并显示出来。代码如下:
#include <stdio.h> #include <stdlib.h> #define FILESTR "E:\c.dat" //定义文件路径 #define STU_NUM 2 struct stu{ char name[10]; //学生名称 int num; //学生学号 float Chinese,math,English; }; int main() { FILE *fp; struct stu stu_a; int i; if((fp=fopen(FILESTR,"rb+"))==NULL) { printf("error: cannot open file!\n"); exit(0); } //用二进制读写形式创建文件 //将位置指针移动到第二个学生的信息开头处 fseek(fp,sizeof(struct stu),0); fread(&stu_a,sizeof(struct stu),1,fp); //读取一条学生信息 printf("%s %d %d %d %d",stu_a.name,stu_a.num, stu_a.Chinese,stu_a.math,stu_a.English); printf("\n"); fclose(fp); return 0; }E:\c.dat文件中存储的学生信息如下:
Liao 1 97 86 86
Tang 2 86 96 86
编译运行程序,结果如下:
Tang 2 86 96 86