【C语言】文件的基本操作— —随机读写数据文件和出错检测

author:&Carlton

book:谭浩强 《C语言程序设计 第五版》

tag:计算机理论,文件操作,C语言

topic:随机读写数据文件和出错检测

date:2023 年 7 月 6 日


目录

随机读写数据文件

随机读写的含义        

随机读写的原理  

文件位置标记

文件位置标记的定位

随机读写的方式

文件读写的出错检测


随机读写数据文件

随机读写的含义        

        根据读写的需要,人为地移动文件位置标记的位置,可以在任何位置写入/读取数据,对文件读写数据的顺序和数据在文件中的物理顺序可以不一致

随机读写的原理  

文件位置标记

        用来指示“接下来要读写的下一个字符的位置”。

        与变量的指针不同,变量的指针是变量在内存中存储单元的地址,而文件是存储在外部介质上的,不存在内存地址

        

文件位置标记的定位

        ①rewind函数使文件位置标记指向文件开头,此函数没有返回值

         rewind(文件类型指针)

                

        ②fseek函数改变文件位置标记

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

        

        起始点:

起始点名字用数字代表
文件开始位置SEEK_SET0
文件当前位置SEEK_CUR1
文件末尾位置SEEK_END2

        位移量:

                以“起始点”为基点,向前移动的字节数。(向后移取负)

                位移量应是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函数重置文件出错标志,以便进行下一次的检测

欢迎指正与分享,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值