我们之前写程序,得到运行结果,退出运行,运行结果就不见了,因为运行的结果放到了内存中,退出程序的时候数据就会消失,等下一次运行又要重新输入数据,这样就显得很麻烦。
那么我们如何保存之前的运行结果呢
将运行的结果放到磁盘中,然后我们的运行结果就会保存,我们下一次运行程序,如果要使用之前的结果,将磁盘的数据读取到程序中,这样就使得程序更加持久。这样的操作就是叫文件操作
文件的打开和关闭
文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态及文件的当前位置等)。这些信息是保存在一个结构体变量中的,这个结构体类型是有系统声明的,取名FILE
![](https://img-blog.csdnimg.cn/img_convert/9d1c0e1fa689d0eb501402eafb973a81.png)
![](https://img-blog.csdnimg.cn/img_convert/b283c4576244ed1512fc0701f641d3db.png)
我们每打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构变量,并且补充信息,使用不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
FILE指针变量的创建
![](https://img-blog.csdnimg.cn/img_convert/55e46e738ea40296986d03e0098e4434.png)
定义pf是一个指向FILE类型数据的指针变量。pf指向文件信息区,通过pf来访问文件信息区内容,然后就可以访问文件内容了。也就是说通过文件指针变量能够找到与它相关联的文件。
文件的打开和关闭
文件在读写之前需要打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针与文件的关系。
ANSIC规定使用fopen函数来打开文件。fclose函数来关闭文件。
fopen函数
![](https://img-blog.csdnimg.cn/img_convert/edcf5cffe75ea7817aaf5abddabb028d.png)
![](https://img-blog.csdnimg.cn/img_convert/478b5410b022e6c631b331fe56b167c0.png)
假如打开文件失败怎么办
![](https://img-blog.csdnimg.cn/img_convert/5a776ef890374f08304307ec11d7b40e.png)
我们建这个文件
![](https://img-blog.csdnimg.cn/img_convert/d1fbb17247ecba30de297ac178214c74.png)
![](https://img-blog.csdnimg.cn/img_convert/3eaa3259073773095b473c17db32d532.png)
我们怎么写内容到文件和读文件的内容呢
文件的顺序读写
![](https://img-blog.csdnimg.cn/img_convert/8dbb56bef1d98272e9a85aedc6eac7c7.png)
我们一个一个来使用这些函数
fgetc函数
![](https://img-blog.csdnimg.cn/img_convert/e973f9e5fb281afe102707ba17790238.png)
通过解释可以看出
![](https://img-blog.csdnimg.cn/img_convert/8c5e30090c245d526522873f4207a29a.png)
![](https://img-blog.csdnimg.cn/img_convert/06dfae862af7753a8c83d5f22bd52f2b.png)
fgetc是读一个字符,那么我们怎么读里面所有字符呢
应该考虑到循环了
![](https://img-blog.csdnimg.cn/img_convert/e7bdc1e1349d660655f737b172d2c04e.png)
我们读取字符失败返回EOF
这样的操作也不怎么好,后面我们会介绍一个函数专门读字符串的
fputc函数
![](https://img-blog.csdnimg.cn/img_convert/6c2d018563644b723e7ec11d945561e1.png)
![](https://img-blog.csdnimg.cn/img_convert/418bc1c6abc364f569a9b57b3d0ccb9c.png)
我们也可以写一堆字符
![](https://img-blog.csdnimg.cn/img_convert/74b2fa97904df43dd636fcf8d939ec5d.png)
fgets函数
![](https://img-blog.csdnimg.cn/img_convert/ec94bb6bd322ddfb978eb7f21d87c639.png)
![](https://img-blog.csdnimg.cn/img_convert/e3e33bfcdb370943400a30c6cc8e8f5f.png)
假如内容为
![](https://img-blog.csdnimg.cn/img_convert/e74a319c6577270dd5cd61abcdcfda5f.png)
我们的读取结果是什么
![](https://img-blog.csdnimg.cn/img_convert/0023508fa05b4deb24a4e31f8bc90a08.png)
fgets函数是文本行读取,只能读一行的数据,第一行只有字符a,所以我们只能读取到a
fputs函数
![](https://img-blog.csdnimg.cn/img_convert/32182d894948d88ab2c8e33b799af14d.png)
![](https://img-blog.csdnimg.cn/img_convert/74bf35d11364ee7508c30bf518ecfc5d.png)
fscanf函数
了解fsanf函数,我们可以通过类比的方法
![](https://img-blog.csdnimg.cn/img_convert/703e3ddb593dfd138bf8a8b76e3d8375.png)
fscanf函数与scanf函数的参数差异就是多了一个结构体类型指针
我们怎么使用这个函数呢
fscanf叫格式化输入函数,可以读取数据
![](https://img-blog.csdnimg.cn/img_convert/b2cd28fb2f71ed9cf338683635fe6237.png)
fscanf读取100到a中
将hello1231.123当成了字符串读取到arr中
换行默认字符串结束,所以3.14读取到f中
之后打印出来,可以看出fscanf是按顺序读取的,以换行为结束标志
fprintf函数
fprintf函数叫格式化输出函数
它怎么实现的,我们类比printf函数
![](https://img-blog.csdnimg.cn/img_convert/dacae5ed033d91cdf568c9bd85b95d9c.png)
好像差不多,和fscanf函数与scanf对比一样
我们通过例子来看看
![](https://img-blog.csdnimg.cn/img_convert/54b0a6aae2ee2c6ff16c5f3bdce2f6cc.png)
fprintf把数据写入文件
fread函数
fread函数得功能是二进制输入,即读取二进制数
![](https://img-blog.csdnimg.cn/img_convert/fda726bf590bea7ffa9480cbb1a309f3.png)
![](https://img-blog.csdnimg.cn/img_convert/98211a6e48ab58c45282ca3ef2f4d64a.png)
fwrite函数
![](https://img-blog.csdnimg.cn/img_convert/b5c32e389f6646d5a7d1ba6236e20c0f.png)
好像fwrite里面的参数贺fread函数一样哎,我们怎么去使用
fwrite是写二进制到文件里面
![](https://img-blog.csdnimg.cn/img_convert/8767f06933d231b6834f5cf4ac698e33.png)
我们缕一缕里面参数
![](https://img-blog.csdnimg.cn/img_convert/da39dbaf0a514c87519655f7ecf4c61a.png)
sscanf函数
![](https://img-blog.csdnimg.cn/img_convert/e16c87710f76f1edc86c693bcd1982f6.png)
我们怎么去使用sscanf函数,它与scanf函数有什么区别
![](https://img-blog.csdnimg.cn/img_convert/ed8964a48179d83bc5a8fc09e79ae2fe.png)
scanf函数是从键盘获取数据,sscanf是从“2022helloworld”获取数据,按数顺序获取
与scanf函数一样读取字符串时遇到空格结束
sprintf函数
![](https://img-blog.csdnimg.cn/img_convert/b3ae124e45a0eebde113fd4268baef70.png)
怎么使用
![](https://img-blog.csdnimg.cn/img_convert/ad0ded160f6e84426f243b0a37bcfa2e.png)
printf函数将数据读取到屏幕,sprintf函数读取到arr字符数组内
下期预告
文件的随机读写
文本文件和二进制文件
文件读取结束的判定
文件缓冲区