我们之前写程序,得到运行结果,退出运行,运行结果就不见了,因为运行的结果放到了内存中,退出程序的时候数据就会消失,等下一次运行又要重新输入数据,这样就显得很麻烦。
那么我们如何保存之前的运行结果呢
将运行的结果放到磁盘中,然后我们的运行结果就会保存,我们下一次运行程序,如果要使用之前的结果,将磁盘的数据读取到程序中,这样就使得程序更加持久。这样的操作就是叫文件操作
文件的打开和关闭
文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态及文件的当前位置等)。这些信息是保存在一个结构体变量中的,这个结构体类型是有系统声明的,取名FILE
![](https://i-blog.csdnimg.cn/blog_migrate/31ddac8f7a80cc19fda7e26d777aac35.png)
![](https://i-blog.csdnimg.cn/blog_migrate/255554a21f8ee63095f68d18cb9b56fa.png)
我们每打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构变量,并且补充信息,使用不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
FILE指针变量的创建
![](https://i-blog.csdnimg.cn/blog_migrate/b8ff7adc67861e4c7f0577a9650c57fe.png)
定义pf是一个指向FILE类型数据的指针变量。pf指向文件信息区,通过pf来访问文件信息区内容,然后就可以访问文件内容了。也就是说通过文件指针变量能够找到与它相关联的文件。
文件的打开和关闭
文件在读写之前需要打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针与文件的关系。
ANSIC规定使用fopen函数来打开文件。fclose函数来关闭文件。
fopen函数
![](https://i-blog.csdnimg.cn/blog_migrate/b60f7d2894034337a00f2675ffc446f6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/21b6c8d81825d70af8e2a3312fcc0774.png)
假如打开文件失败怎么办
![](https://i-blog.csdnimg.cn/blog_migrate/03411095b94815707f9eedd4b4df3508.png)
我们建这个文件
![](https://i-blog.csdnimg.cn/blog_migrate/1577808906dfd6f3725838cbc6044cdf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d2b839b509d92525dde1bdf3271edea5.png)
我们怎么写内容到文件和读文件的内容呢
文件的顺序读写
![](https://i-blog.csdnimg.cn/blog_migrate/0f0826123391f08a0c53c7ec7be7e949.png)
我们一个一个来使用这些函数
fgetc函数
![](https://i-blog.csdnimg.cn/blog_migrate/310d958ec60971442cb855d38c92df9e.png)
通过解释可以看出
![](https://i-blog.csdnimg.cn/blog_migrate/828d35ea98e1a5788b89d3c4ee28e51b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b309960a0a6828be62fc0ac172280749.png)
fgetc是读一个字符,那么我们怎么读里面所有字符呢
应该考虑到循环了
![](https://i-blog.csdnimg.cn/blog_migrate/0f108b12fb579a0676c802ef916f1c72.png)
我们读取字符失败返回EOF
这样的操作也不怎么好,后面我们会介绍一个函数专门读字符串的
fputc函数
![](https://i-blog.csdnimg.cn/blog_migrate/e564fb5ca4322a6f4ebc735de7e996a8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3fda4315533e62b8679b9f1082213fe.png)
我们也可以写一堆字符
![](https://i-blog.csdnimg.cn/blog_migrate/98fa6ad6b9543b47e420d8d5c8c39e8c.png)
fgets函数
![](https://i-blog.csdnimg.cn/blog_migrate/2934a9496bbd6e71a0f48c3dc30975a9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/99996e6f3dde969e26a331592fc358e2.png)
假如内容为
![](https://i-blog.csdnimg.cn/blog_migrate/6090876d1f9aa7d10c9f0815c55af387.png)
我们的读取结果是什么
![](https://i-blog.csdnimg.cn/blog_migrate/2caee2b6f858a85b7beae2d9356a82be.png)
fgets函数是文本行读取,只能读一行的数据,第一行只有字符a,所以我们只能读取到a
fputs函数
![](https://i-blog.csdnimg.cn/blog_migrate/6dddf4293b9fc55d182eb5bfd88aaf4d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ddc5e4580d22275ad6c4c7b43a9a244f.png)
fscanf函数
了解fsanf函数,我们可以通过类比的方法
![](https://i-blog.csdnimg.cn/blog_migrate/183ba57937a074abe81820cbdd7e8b4f.png)
fscanf函数与scanf函数的参数差异就是多了一个结构体类型指针
我们怎么使用这个函数呢
fscanf叫格式化输入函数,可以读取数据
![](https://i-blog.csdnimg.cn/blog_migrate/5535aef59c45ee1e4d898b8f45eb9321.png)
fscanf读取100到a中
将hello1231.123当成了字符串读取到arr中
换行默认字符串结束,所以3.14读取到f中
之后打印出来,可以看出fscanf是按顺序读取的,以换行为结束标志
fprintf函数
fprintf函数叫格式化输出函数
它怎么实现的,我们类比printf函数
![](https://i-blog.csdnimg.cn/blog_migrate/3424169ef3187b64b588d921f2b830b1.png)
好像差不多,和fscanf函数与scanf对比一样
我们通过例子来看看
![](https://i-blog.csdnimg.cn/blog_migrate/f35b5661cd12432e4a08e3c9176915c8.png)
fprintf把数据写入文件
fread函数
fread函数得功能是二进制输入,即读取二进制数
![](https://i-blog.csdnimg.cn/blog_migrate/6d53e9aeca282b8d248949440dfbbf26.png)
![](https://i-blog.csdnimg.cn/blog_migrate/56e041b77fa32499ae2543e11514943f.png)
fwrite函数
![](https://i-blog.csdnimg.cn/blog_migrate/b6ca3091ed6aee505f0d1c68c5dbc2da.png)
好像fwrite里面的参数贺fread函数一样哎,我们怎么去使用
fwrite是写二进制到文件里面
![](https://i-blog.csdnimg.cn/blog_migrate/cadf6bf298f0e402765b5c966778dcb0.png)
我们缕一缕里面参数
![](https://i-blog.csdnimg.cn/blog_migrate/4369c09b91ad7a38d54cc6e030a16917.png)
sscanf函数
![](https://i-blog.csdnimg.cn/blog_migrate/ff5e634c3f3599f33d18c4ea2437f6e5.png)
我们怎么去使用sscanf函数,它与scanf函数有什么区别
![](https://i-blog.csdnimg.cn/blog_migrate/975739db2eedac7708f9d9f7e6a877d5.png)
scanf函数是从键盘获取数据,sscanf是从“2022helloworld”获取数据,按数顺序获取
与scanf函数一样读取字符串时遇到空格结束
sprintf函数
![](https://i-blog.csdnimg.cn/blog_migrate/bbb4b0e3afe72eff71c5d18bb8c6319f.png)
怎么使用
![](https://i-blog.csdnimg.cn/blog_migrate/a88fee912c2f48e15716bc8299386245.png)
printf函数将数据读取到屏幕,sprintf函数读取到arr字符数组内
下期预告
文件的随机读写
文本文件和二进制文件
文件读取结束的判定
文件缓冲区