首页 > 编程笔记 > C语言笔记 阅读:11

C语言rewind()和fseek()随机读写文件的用法(附带实例)

在 C 语言程序中,通常文件读写方式都是先打开文件,然后从文件的开头开始读写。

如果想要读写文件中间或者文件后面的数据,从文件开头开始读写不但浪费内存,而且效率很低。因此,下面运用 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

相关文章