author:&Carlton
tag:计算机理论,文件操作,C语言
topic:随机读写数据文件和出错检测
date:2023 年 7 月 6 日
目录
随机读写数据文件
随机读写的含义
根据读写的需要,人为地移动文件位置标记的位置,可以在任何位置写入/读取数据,对文件读写数据的顺序和数据在文件中的物理顺序可以不一致。
随机读写的原理
文件位置标记
用来指示“接下来要读写的下一个字符的位置”。
与变量的指针不同,变量的指针是变量在内存中存储单元的地址,而文件是存储在外部介质上的,不存在内存地址。
文件位置标记的定位
①rewind函数使文件位置标记指向文件开头,此函数没有返回值
rewind(文件类型指针)
②fseek函数改变文件位置标记
fseek(文件类型指针,位移量,起始点)
起始点:
起始点 | 名字 | 用数字代表 |
文件开始位置 | SEEK_SET | 0 |
文件当前位置 | SEEK_CUR | 1 |
文件末尾位置 | SEEK_END | 2 |
位移量:
以“起始点”为基点,向前移动的字节数。(向后移取负)
位移量应是long型数据(在数字末尾加上字母L)
一般用于二进制文件
③ftell函数测定文件位置标记的当前位置
ftell(文件类型指针)
得到流式文件中文件位置标记的当前位置,用相对于文件开头的位移量来表示。
出错时返回值为-1L
随机读写的方式
结合rewind函数和fseek函数来实现随机读写
举个栗子:在磁盘文件stu.dat(省略了文件路径)上存有10个学生的数据,要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕中显示出来。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义学生信息结构体
struct Student
{
char name[10];
int num;
int age;
char addr[15];
}stud[10];
FILE *fp;
//用只读二进制文件的形式打开文件
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("This file can not open\n");
exit(1);
}
//按需从文件读出数据并存储给结构体数组stud,并在显示屏打印
int i;
for(i=0;i<10;i+=2)
{
//移动文件位置标记
fseek(fp,i*sizeof(struct Student),0);
fread(&stud[i],sizeof(struct Student),1,fp);
printf("%-10s%4d%4d%-15s\n",stud.name,stud.num,stud.age,stud.addr);
}
//别忘了先关闭文件
fclose(fp);
return 0;
}
文件读写的出错检测
①ferror函数
ferror(文件类型指针)
若未出错,返回值为0,否则返回非零值
执行fopen函数时,ferror函数的初始值自动置为0
对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值,因此应在调用一个输入输出函数后立即检查ferror函数的值。
②clearerr函数
clearerr(文件类型指针)
使文件出错标志和文件结束标志置为0,当调用一个输入输出函数出错导致ferror函数得到非零值时,应立即调用clearerr函数重置文件出错标志,以便进行下一次的检测
欢迎指正与分享,谢谢!