C语言文件操作

前言

我们写的程序都是在内存上运行的,从内存上读取数据,再将数据写入内存中。那么问题来了,程序一旦运行结束,运算的数据也会随之消失。那么数据是如何长期存储的呢?这就是我们今天要介绍的主角——文件及文件操作。

什么是文件

文件的分类

按存储类型分

文件可以分为程序文件和数据文件。顾名思义

程序文件就是一些源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)

数据文件就是存储程序运⾏时读写的数据

按存储方式分

文件可分为二进制文件和文本文件。顾名思义

二进制文件是不经过任何翻译,原原本本的将内存中的数据存入二进制文件当中

文本文件经过翻译,将二进制转换成相应的ASCII码存入文本文件当中

文件名

⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤户识别和引⽤。

⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀

但我们日常说的文件名一般指文件名主干

再介绍文本操作前,我们先铺垫一个知识——流

为了降低程序员的编译难度,不用困扰于适配各种各样不同类型的输入输出设备,我们抽象出“流” 的概念。流就像一个巨大的池塘,所有的输入设备的数据都可以流入这个池塘里,所有的输出设备也都可以从池塘里读取数据。流也是一种资源,需要打开和关闭。那么我们为什么以前写代码从来就没有手动的打开或者关闭流呢?因为有些流是编译器默认打开的。下面我们将简单介绍三个编译器默认打开的流

标准流

stdin-标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout-标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。
stderr-标准错误流,⼤多数环境中输出到显⽰器界⾯。
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。

文件指针

初识文件指针

我们有了流,但需要有东西能来维护它,完成各种读写的操作。C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

概念是“⽂件类型指针”,简称“⽂件指针”。
每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE。在这里我们不需要关系内部的细节是如何实现的。下⾯我们可以创建⼀个FILE*的指针变量

FILE* pf;//⽂件指针变量

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区中的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。

文件的打开与关闭

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。
在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。
ANSI C 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

其中打开文件中 filename 代表要操作的文件名,mode 指打开的方式权限,返回一个文件指针

关闭文件只需要传递需要关闭的文件指针,空指针不做任何操作。所有建议一旦关闭一个文件顺手就应该把文件指针置为空

mode的取值,只需要了解这些重要的

文件顺序读写

 文件顺序读写,重点掌握以下的函数

文件随机读写

fseek

根据⽂件指针的位置和偏移量来定位⽂件指针

int fseek ( FILE * stream, long int offset, int origin );

ftell

返回⽂件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

rewind

让⽂件指针的位置回到⽂件的起始位置

void rewind ( FILE * stream );


 文件读取结束的判定

feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。
⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
 

文件缓冲区

为了提升操作系统工作的效率,我们引入了文件缓冲区的概念。

指的是我们将要存入的数据放到缓冲区中,每次关闭文件或者手动刷新即会将数据写入文件中。

所有我们不用文件时应该及时关闭,及时刷新缓冲区,否则可能导致文件错误

手动刷新文件缓存区

int fflush(FILE *stream)

结语

以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。

因为这对我很重要。

编程世界的小比特,希望与大家一起无限进步。

感谢阅读!

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值