C语言---文件操作详解

引言:当没有文件的时候,程序写的数据是储存在电脑的内存当中的,当程序退出时,内存就会给回收,数据就会丢失了,当再次运行时,数据就丢失了,如果要将数据进行持久的保存,我们就要使用到文件操作。

1.文件的分类(就程序设计而言)

就程序设计而言,文件可分为两类,一个是程序文件,另一个是数据文件。

程序文件包括包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe),我们将在后面的程序编译链接中提到

数据文件包括文本文件二进制文件,数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件,这类文件直接打开将会是一长串看不懂的乱码;如果在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符的形式存储的文件就是文本文件,这类文件才是供我们阅读的文件

字符⼀律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使⽤⼆进制形式存储。那么他们究竟是如何进行储存的呢,如图可以知道。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),而⼆进制形式输出,则在磁盘上只占4个字节

在这里插入图片描述

2.文件的打开与关闭

2.1 流和标准流

流的概念:我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河,我们从中获取想要的内容

C程序针对⽂件、画面、键盘等的数据输⼊输出操作都是通过流操作的。

⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

例如:我们在使用scanf、printf函数的时候,我们都是通过流操作,只是操作的是标准流

C语⾔程序在启动的时候,默认打开了3个流:

  • stdin–标准输入流,在大多数的环境中从键盘输⼊,scanf函数就是从标准输入流中读取数据。

  • stdout–标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出

    中。

  • stderr–标准错误流,大多数环境中输出到显示器界面。

    stdinstdoutstderr三个流的类型是: FILE* ,通常称为文件指针。C语言中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

2.2 文件指针(FILE*)

缓冲⽂件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了⼀个相应的⽂件信息区,用来存放文件的相关信息(如文件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE

每当打开⼀个⽂件的时候,系统会根据文件的情况自动创建⼀个FILE结构的变量,并填充其中的信
,使用者不必关心细节,⼀般都是通过⼀个FILE的指针来维护这个FILE结构的变量,这样使⽤起来更加方便

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

在这里插入图片描述

//所以,通常我们使用文件,只需要定义一个文件指针再结合相关函数就可以使用啦
//下面举个例子
#include <stdio.h>
int main ()
{
	FILE * pFile;
    //打开⽂件
	pFile = fopen ("myfile.txt","w");
    //fopen是一个函数
    //fopen ( const char * filename, const char * mode );mode是表示文件打开的模式
    //mode一般"r""w""a"只读,只写,和追加用的比较多,当指定文件不存在时候,后两个会新建一		个文件,只读会报错
	//⽂件操作
	if (pFile!=NULL)//如果打开失败会返回NULL
	{
		fputs ("fopen example",pFile);
		//关闭⽂件
		fclose (pFile);
	}
	return 0;
}

3.文件读写函数

顺序读写函数有以下几种

在这里插入图片描述

随机读写函数有以下几种

fseek—根据文件指针的位置偏移量来定位文件指针

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

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

long int ftell ( FILE * stream );

rewind—让文件指针的位置返回文件的起始位置

void rewind ( FILE * stream );

对于文件操作函数就介绍到这里了 ,因为只需要了解文件操作的整体逻辑,会用会看就差不多了,文件操作的函数有很多,但是使用方式都大同小异,只需要掌握几个常用的即可

4.文件读取结束的判定

tips:在⽂件读取过程中,不能用feof函数的返回值直接来判断⽂件的是否结束。feof 的作⽤是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束

1.文本文件读取是否结束,判断返回值是否为EOFNULL

例如:

  • fgetc是如果读到文件末尾或者读取出错时返回EOF

  • fgets是如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数

例如:fread判断返回值是否小于实际要读的个数。

5.文件缓冲区

关于文件缓冲区,我们用一张图可以解释,一句话总结就是,程序数据输入输出都会先送到缓存区,当缓冲区满了,或者主动刷新缓冲区,才会将数据送往目的地
在这里插入图片描述

文件缓冲区

关于文件缓冲区,我们用一张图可以解释,一句话总结就是,程序数据输入输出都会先送到缓存区,当缓冲区满了,或者主动刷新缓冲区,才会将数据送往目的地

[外链图片转存中…(img-bOi6LHNP-1751339987088)]

结论是,有缓冲区的存在,我们在操作文件时,需要在刷新缓冲区后和文件操作结束时候关闭文件,如果不这么做,将可能导致读写文件出现问题。(tips:fclose在关闭文件的时候,也会刷新缓存区)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值