从上帝视角看文件操作
1.为什么使用文件?
如果没有文件,我们写的程序中的数据是存储在电脑的内存中,当程序退出时,内存被回收后,数据就丢失了,等下次运行程序,是无法看到上次程序的数据的。(比如我们在程序中写通讯录时,联系人的相关数据都是放在内存中的,当程序退出时,这些数据也会随之消失,下次运行通讯录时,又得重新录入数据,很是麻烦。)因此,可以使用文件来长期保存数据。
2.文件的相关介绍
2.1:什么是文件?
外存(如C盘、D盘、U盘等)上的文件就是文件。
2.2:文件的分类
在程序设计中,我们⼀般谈的文件有两种(按功能划分):程序文件与数据文件。本篇博客讨论的是数据文件。
a.程序文件
程序文件包括源程序文件(后缀为.c),目标文件(windows环境下后缀为.obj,Linux环境下后缀为.o),可执行程序(windows环境下后缀为.exe)。
b.数据文件
存放数据的文件。数据是指程序运行时从文件中读、写的数据。程序运行时既可以从数据文件中读取数据,也可以将数据输出到数据文件中。
2.3:文件名
每个文件都有唯⼀的文件标识,以便用户识别和使用。文件名包含3部分:文件路径+文件名主干+文件后缀。
3.二进制文件与文本文件
3.1:二进制文件与文本文件的介绍
根据文件中存储的内容不同,可将文件分为二进制文件与文本文件。我们知道数据在内存中是以⼆进制的形式存储。若数据依旧以二进制的形式存储到外存的文件中,则该文件就是二进制文件;若数据以ASCII码的形式存储到外存的文件中,则该文件就是文本文件。文本文件通过记事本打开时,肉眼是能够看懂的,而二进制文件通过记事本打开时,全部是乱码,肉眼看不懂。
#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("test.txt", "wb");//f:file(文件),o:open(打开)/*fopen函数在该源文件所在的路径下,打开名为test.txt的文件(若该文件不存在,就在该源文件所在的路径下,创建名为test.txt的文件),并在该文件中写入二进制的数据。w:write(写),b:binary(二进制)*/fwrite(&a, 4, 1, pf);//在该文件中写入二进制的数据,该数据占4个字节,写入1次fclose(pf);//关闭该文件pf = NULL;return 0;
}
4.文件的打开与关闭
4.1:流
流是一个高度抽象的概念。我们知道水流里面流淌的是水,而我们要探讨的流是指数据流,它里面流淌的是数据。程序在读取(输入)数据或写入(输出)数据时,并不是直接与外部设备进行数据传输,而是通过流来进行,流是程序与外部设备之间进行数据传输的中转站。以程序从外部设备中读取数据为例:先要打开流,然后外部设备将数据传输给流,程序再从流中读取数据。
4.2:标准流
程序在运行时,我们经常从键盘上读取数据,然后将程序运行的数据输出到屏幕上,为什么我们没有手动打开流呢?因为C语⾔程序在启动的时候,默认打开了3个流:标准输入流 stdin,标准输出流 stdout,标准错误流 stderr。
4.3:文件指针变量的介绍
缓冲文件系统中,有个关键的概念: 文件指针变量,简称文件指针。每当打开文件时,会在内存中开辟⼀个相应的文件信息区(本质上是结构体类型变量,即FILE类型的变量),用来存放该文件的相关信息(如文件的名字,文件状态及文件的存储位置……)。该结构体类型是由系统创建的,并用typedef将该结构体类型重命名为 FILE类型。
不同的C语言编译器中,FILEl类型包含的内容可能会有所不同,但大致是一样的。每当打开文件时,系统会根据该文件的情况自动创建⼀个FILE类型的变量,并填充其中的信息。文件的使用者不必关心填充的内容是什么。可以通过FILE *类型的指针变量来维护这个FILE类型的变量。
4.4:文件指针变量的创建
文件指针变量也就是FILE*类型的指针变量。
FILE * pf;
pf是指向FILE类型变量的指针变量。它指向某个文件的文件信息区(本质是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。
4.5文件的打开与关闭
就像我们在冰箱中放/取东西,先打开冰箱门,放/取东西,关闭冰箱门;在对文件进行操作时,我们需要先打开文件,再从文件中读取数据或者向文件中写入数据,最后记得要关闭文件。
每当打开文件时,系统会自动创建一个文件信息区,并返回文件信息区的地址(FILE * 类型),可以将该地址存放到FILE*类型的指针变量中,这样就能将文件与指针变量建立联系了。
a.绝对路径与相对路径
绝对路径是从根目录开始的,相对路径是从当前文件所在的路径开始的。
b.当前路径与上一级路径
c.fopen函数和fclose函数的介绍
示例1:
示例2:
int main()
{FILE* pf = fopen("C:\\AppStore\\WebCache\\test.txt", "w");// '\\'是转移字符,表示一个'\'//"C:\\AppStore\\WebCache\\test.txt"是绝对路径 + 文件名 + 文件名后缀,该路径也可以写成"C:/AppStore/WebCache/test.txt"//若文件打开成功,则返回该文件的文件信息区的地址if (pf == NULL){//test.txt文件打开失败perror("fopen:");return 1;}else{printf("文件打开成功\n");}return 0;
}
示例3:
#include<stdio.h>
int main()
{//若test.txt文件在当前源文件的上一级路径下,FILE* pf = fopen(".\\..\\test.txt", "w");//以写的方式打开test.txt文件,//".\\..\\test.txt"表示相对路径 + 文件名 +文件名后缀//也可以写为"./../test.txt"//若文件打开成功,则返回该文件的文件信息区的地址if (pf == NULL){//test.txt文件打开失败perror("fopen:");return 1;}else{printf("文件打开成功\n");}//接着读取文件中的数据,或者向文件中写入数据//......//最后关闭文件fclose(pf);pf = NULL;