随机读写数据文件
一、随机读写原理
在我们写数据时,有一个光标不断的在随着新写入的数据往后移动;
而读数据时,也有一个看不见光标,随着已经读完的数据,往后移动
这里的文件读写位置标记——可以想象成图形界面里的光标,读写时自动移动
也类似于看电影,听音乐时的进度条
而随机读写就是随机跳跃移动光标,或是进度滚动条
二、随机读写函数fseek说明,fseek的简单应用
//把D盘目录下的1.txt文件(D:\\1.txt)的内容(前提有该文件且有数据),读2次并输出到屏幕
可以看到上图第一遍fread的返回值len1为15,不是100,因为fread的返回值是实际读取的数据数量
而第二个为0,并没有读进来,这是因为——
例如读下图中的一串数据,第一遍顺序读到末尾,光标显示在末尾
读完了第二次重新从光标的这个位置再去读,
此时光标已经在数据的最末尾了,那么再去读已经没有数据了
所以在第二次读len2之前,我们要将文件标记位置,重新移动到文件开头——fseek
fseek有3个参数
1.文件位置指针fr
2.字节距离这个参照点的位置
3.初始化的位置,也叫参照点,参照物
它提供了3个参照点,(参照点在哪,光标在哪)
第一个是文件标记位置,光标的当前位置;第二个是文件尾;第三个是文件头
之后通过第二个参数将光标往左或是往右偏移多少个字节
现在光标就能到达你想达到的位置,即随机函数
例如要到达文件开头,那就是偏移量为0,以文件开头为参照点
fseek(fr,0,SEEK_SET)
要是以第一遍读完后的文件尾,为当前位置,作参照点,
那么往左移为负数,往右移为正数
从尾回到头就是-len1
三、读取指定学生信息
//1打开2读3输出4跳过
//再磁盘文件上存有10个学生的数据,将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来
//学生结构体
typedef struct Student
{
char name[20];//姓名
int num;//学号
int age;//年龄
char addr[100];//地址
} Student;
//1打开2读3输出4跳过
int main()
{
FILE* fr = fopen("1.txt", "rb");
if (fr == NULL)
{
printf("文件打开失败\n");
return -1;
}
Student stu;//读到stu里面
int len;
for (int i = 0; i < 3; i++)//读3个学生的信息
{
len=fread(&stu, sizeof(Student), 1, fr);
if (len < 1)//要信息了求读一次却没有读到1,说明文件已经没有
{
printf("文件结束了\n");
break;
}
printf("%s %d %d %s\n", stu.name, stu.num, stu.age, stu.addr);
//跳过偶数位置
fseek(fr,sizeof(Student), SEEK_CUR);//跳过一个学生大小的字节数
}
fclose(fr);
return 0;
}