计算机科学类专升本复习之“C语言rewind和fseek函数的用法“详解(初稿)

C语言rewind和fseek函数的用法详解(随机读写文件)

前面所讲到的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据。

但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写。

这种读写方式称为随机读写,也就是说从文件的任意位置开始读写。

实现"随机读写"的 关键 是要"按要求移动位置指针",这称为"文件的定位"。

一、文件定位函数"rewind()函数"和"fseek()函数"

移动"文件内部位置指针"的函数主要有两个

即 rewind() 和 fseek()。

rewind()函数 用来将 "位置指针" 移动到 "文件开头"。

前面已经多次使用过,它的原型为:

    void rewind(FILE *fp);

fseek()函数 用来将 "位置指针" 移动到 "文件末尾"。

它的原型为:

    int fseek(FILE *fp,long offset,int origin);

参数说明:

1. fp 为 文件指针,也是"被移动的文件"

2. offset为"偏移量",也就是要"移动"的字节数。

之所以为long类型,时希望"移动"的范围更大,能处理的文件更大。

offset为 "正" 时, "向后" 移动。

offse 为 "负" 时, "向前" 移动。

3. oringin为"起始位置",也就是"从何处开始计算偏移量"。

C语言规定的"起始位置"有三种,分别为"文件开头、当前位置和文件末尾"。

每个位置都有相对应的"常量"来表示:

具体如下:

 起始点         常量名        常量值

文件开头        SEEK_SET        0

当前位置        SEEK_CUR        1

文件末尾        SEEK_END        2

例如,把位置指针移动到离文件开头100个字节处:

fseek(fp,100,0);



 

二、文件的随机读写

在"移动" 位置指针 之后,就可以用前面介绍的"任何一种" "读写函数" 进行读写了。

由于是"二进制文件",因此 常用"fread()函数"和"fwrite()函数"进行读写。

讲个程序例子吧:

//从键盘输入三组学生信息,保存到文件中,然后读取第二个学生的信息。

#include<stdio.h>



#define N 3

struct stu{

    char name[10]; //姓名

    int num;//学号

    int age;//年龄

    float score; //成绩

}boys[N],boy, *pboys;



int main()

{

    FILE *fp;

    int i;

    pboys = boys;

    if((fp=fopen("D:\\demo.txt","wb+")) == NULL)

    {

        printf("Cannot open file, press any key to exit!\n");

        getch();

        exit(1);

    }



    printf("Input data:\n");

    for(i=0;i<N;i++,pboys++)

    {

         scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);

    }

    fwrite(boys, sizeof(struct stu), N, fp);  //写入三条学生信息

    fseek(fp, sizeof(struct stu), SEEK_SET);  //移动位置指针

    fread(&boy, sizeof(struct stu), 1, fp);  //读取一条学生信息

    printf("%s  %d  %d %f\n", boy.name, boy.num, boy.age, boy.score);

    fclose(fp);

    return 0;

}

运行结果:

Input data:

Tom 2 15 90.5↙

Hua 1 14 99↙

Zhao 10 16 95.5↙

Hua  1  14 99.000000

上一篇:C语言读取写入CSV文件 [二]进阶篇——写入CSV文件


下一篇:Basic Model(一)