随机读写数据文件
标签: C语言
学习人数: 9.3k

前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。

 

文件位置标记及其定位

移动文件内部位置指针的函数主要有两个,即 rewind 函数和 fseek 函数。

rewind 函数前面已多次使用过,其调用形式为:

rewind(文件指针);  

它的功能是把文件内部的位置指针移到文件首。

下面主要介绍 fseek 函数。

fseek 函数用来移动文件内部位置指针,其调用形式为:

fseek(文件指针,位移量,起始点);  

其中:

“文件指针”指向被移动的文件。

“位移量”表示移动的字节数,要求位移量是 long 型数据,以便在文件长度大于 64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。 “起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。

其表示方法如下表。

例如:

fseek(fp, 100L, 0);  

其意义是把位置指针移到离文件首 100 个字节处。

还要说明的是 fseek 函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。

 

随机读写

在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用 fread 和 fwrite 函数。

下面用例题来说明文件的随机读写。

【例】在学生文件 stu_list 中读出第二个学生的数据。

#include<stdio.h>  
#include<stdlib.h>//exit  
#include<conio.h>//getch  
  
struct stu {  
    char name[10];  
    int num;  
    int age;  
    char addr[15];  
}boy, *qq;  
  
int main() {  
    FILE *fp;  
    char ch;  
    int i = 1;  
    qq = &boy;  
    if((fp = fopen("stu_list","rb")) == NULL) {  
        printf("Cannot open file strike any key exit!");  
        getch();  
        exit(1);  
    }  
    rewind(fp);  
    fseek(fp, i*sizeof(struct stu), 0);  
    fread(qq, sizeof(struct stu), 1, fp);  
    printf("\n\nname\tnumber age addr\n");  
    printf("%s\t%5d %7d %s\n", qq->name,...
登录查看完整内容


课后作业

掌握本节内容


登录后开始许愿

暂无评论,来抢沙发