1.前言
为什么要使用文件呢?文件有什么作用呢?你是否还记得我们前面写的通讯录吗?在通讯录中我们进行了一改造由静态通讯录改为动态通讯录,但是有一点让我们非常难受,每次当我们运行起来程序的时候程序中都没有上次输入的信息,我们知道程序结束后程序开辟的内存会释放,我们输入的信息会随着内存的销毁而销毁,那我们应该如何保存我们的信息呢,信息保存有两种方式,一种是通过文件一种是通过数据库,在这里我给大家带来通过文件来保存信息,文件操作包括文件打开关闭,写文件读文件等的函数,以及改造我们的动态通讯录让他成为可以保存信息的动态通讯录。
2. 什么是文件
磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的).
2.1 程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
2.2 数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本章讨论的是数据文件。在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
2.3 文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀例如: c:\code\test.txt为了方便起见,文件标识常被称为文件名。
3.文件的打开与关闭
3.1文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE
3.2文件的打开
文件打开需要用到函数fopen,我们进入cplusplus网站fopen查看函数的参数和返回值
函数的返回值是FILE*类型,第一个参数是const char * filename这里值文件名,第二个参数const char * mode是文件的打开方式,打开方式可以分为:
文件使用方式 | 含义 | 如果指定文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
3.3文件的关闭
同样我们进入cplusplus网站fclose查看fclose函数的返回类型和参数
函数的返回值是int,参数是 我们指向的流,在这里我们指的是打开文件返回的指针
3.4文件打开与关闭的代码
#include<stdio.h> int main() { FILE* pf = fopen("data.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } else { //写文件 } fclose(pf); pf = NULL; return 0; }
在我们运行程序前我们的文件不包括data.txt文件,我们运行后 可以看到文件中有data.txt文件,注意我们必须将文件的扩展名选项打开,否则会出现一些意想不到的错误。
3.5流
如果没有流,我们想要传输数据,需要我们自己去解决,由于外部设备种类多,每一种的传输方式又不相同,要想全部掌握会非常的难,因此出现了流这一个概念
流是一个高度抽象的概念看到上面是不是有点难以理解我们可以将流理解为数据传输过来,通过流,系统传输到正确的外部设备上
我们将数据传到流上,流再传到外部设备上,流就是数据。在我们程序运行时,编译器会自动打开三个流,标准输入流 stdin,标准输出流stdout,标准错误流stderr.例如代码
#include<stdio.h> int main() { char ch = 'a'; fputc(ch, stdout); return 0; }
今天的内容就结束了,欢迎大家来三连。