引入

前面,我们知道了什么是文件位置标记,以及如何控制文件位置标记,学会了 rewind 和 fseek 这两个函数后,我们就来实现一下随机读写!

例子

输入10个学生成绩,然后存储到文件,接着读入文件,将1,3,5,7,9号学生数据输出到计算机上。

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
int main(){
    struct Student{
        int num;
        char name[10];
        float score;
    }stu[10];
    //输入数据
    for (int i=0;i<10;i++){
        scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);
    }
    //存储数据
    FILE *fp;
    fp=fopen("/Users/liulin/1.txt","wb");
    printf("存储的数据是:\n");
    for(int i=0;i<10;i++){
        fwrite(&stu[i],LEN,1,fp);
        printf("第%d号%s的成绩是:%3.1f\n",stu[i].num,stu[i].name,stu[i].score);
    }
    fclose(fp);
    //读入数据
    printf("1、3、5、7、9的数据是:\n");
    struct Student stu_in[10];
    fp=fopen("/Users/liulin/1.txt","rb");
    for(int i=0;i<10;i=i+2){
        fseek(fp,i*LEN,0);
        fread(&stu_in[i],LEN,1,fp);
        printf("第%d号%s的成绩是:%3.1f\n",stu_in[i].num,stu_in[i].name,stu_in[i].score);
    }
    fclose(fp);
    return 0;
}

输入:

1002 liulin 93.9
1003 liulin 94.9
1004 liulin 97.9
1005 liulin 98.9
1006 liulin 93.9
1007 liulin 92.9
1008 liulin 94.9
1009 liulin 95.9
10010 liulin 91.9

输出:

存储的数据是:
第1001号liulin的成绩是:99.9
第1002号liulin的成绩是:93.9
第1003号liulin的成绩是:94.9
第1004号liulin的成绩是:97.9
第1005号liulin的成绩是:98.9
第1006号liulin的成绩是:93.9
第1007号liulin的成绩是:92.9
第1008号liulin的成绩是:94.9
第1009号liulin的成绩是:95.9
第10010号liulin的成绩是:91.9
1、3、5、7、9的数据是:
第1001号liulin的成绩是:99.9
第1003号liulin的成绩是:94.9
第1005号liulin的成绩是:98.9
第1007号liulin的成绩是:92.9
第1009号liulin的成绩是:95.9

解析

这两句一定要搞清楚

fseek(fp,i*LEN,0);
fread(&stu_in[i],LEN,1,fp);

第一句是从0即从文件头开始,向后移动 i 个 LEN 的长度,即移动了文件标记位置。
第二句是,从当前这个位置,读入 LEN 个长度的数据。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。