目录
1.文件是什么?
好像通俗理解,磁盘(硬盘)上的文件是文件。
但是在程序设计中,我们一般谈的文件(从文件功能的角度来分类的)有两种:程序文件、数据文件。
1.1 程序文件
程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obi),可执行程序(windows环境后缀为.exe)。
1.2 数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。类似后缀为.txt之类的文件。
在vs敲代码,所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。(像下图这样,从键盘输入5,在显示器上显示出5)
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,本文处理的就是磁盘上文件。
2.学习文件操作的前置知识
2.1流和标准流
2.1.1流
我们要先理解流的概念。
程序的数据需要输出到各种外部设备,也需要从外部设备获取数据。
不同外部设备的输入输出操作各不相同,那程序员需要学习的操作就太多了吧。(像下图一样,那程序员至少要学习9种)
为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,可以把流想象成流淌着字符的河。
程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。(有了流之后,程序员上手的效率大大提升,只需要学习对流操作的方法)
2.1.2标准流
那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:
stdin-标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
stdout-标准输出流,大多数环境中输出至显示器界面,printf函数就是将信息输出到标准输出流。
stderr-标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是:FILE *,通常称为文件指针。(FILE *这个文件指针其实也就是一种类型而已)
C语言中,就是通过 FILE*的文件指针来维护流的各种操作的。
2.2文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针“。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名 FILE. 所以,FILE是一个结构体类型.
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
创建一个FILE *类型的指针变量。
定义pf是一个指向FILE类型数据的指针变量。
可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。
(画一个抽象的图理解一下,大家应该能清晰地感受到。)
3.文件打开和关闭操作
文件操作有:打开文件,读/写,关闭文件。先讲简单的打开和关闭操作。
我们用fopen函数来打开文件,fclose函数来关闭文件。在官网上cplusplus.com学习这两个函数。
3.1文件打开
注意,fopen函数第一个参数是文件名,第二个是文件打开方式,返回类型是FILE*.
文件名是什么?
一个文件要有一个唯一的文件标识,以便用户识别和引用。为了方便起见,文件标识常被称为文件名。文件名包含3部分: 文件路径 + 文件名主干 + 文件后缀。例如:c:\code\test.txt。
文件打开方式?
三列表格。(这里指列举一些常见方式,并不是全部)
文件使用方式 | 含义 | 如果指定文件不存在 |
"r" (只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w" (只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
"a" (追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
"rb" (只读) | 为了输入数据,打开一个二进制文件 | 出错 |
"wb" (只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
"ab" (追加) | 向一个二进制文件尾添加数据 | 建立一个新的文件 |
注意:
1.读和写的区别:
2.二进制文件和文本文件区别:
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。
如果要求在外存上以ASCI码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。(这里不展开赘述)
返回类型:
返回类型是FILE*,所以我们需要用文件指针变量接收。
举例:
以写的形式打开一个文件(大家可以自己去试试别的)
没有报警告,说明成功创建。assert是断言,来判断pf指针是否是空指针。
如果不给出详细路径,那么新文件将会创立在.c源文件所在的文件夹里。
3.2文件关闭
fclose函数的参数是文件指针变量,返回类型是整型。
注意返回类型:
如果成功关闭文件,那么fclose函数返回整数0;
如果关闭失败,那么fclose函数返回EOF.
操作一下:
还有文件读/写操作,太多内容了,下一篇博客见~