/————C语言文件操作(主讲文件操作的函数、实践与应用)
本章重点
1. 为什么使用文件
2. 什么是文件
3. 文件的打开和关闭
4. 文件的顺序读写
5. 文件的随机读写
6. 文本文件和二进制文件
7. 文件读取结束的判定
8. 文件缓冲区
//————1. 为什么使用文件
我们前面学习结构体时,运行时数据是(暂时)存放在内存中的,当程序退出的时候空间需要回收,通讯录中的数据就不存在了,等下次运行通讯
录程序的时候,数据又得重新录入。当我们想把信息记录下来的时候,只有我们自己选择删除数据的时候,数据才不复存在。
这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。
使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化(的存储)。
//——2. 什么是文件
磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)
//2.1 ——程序文件
包括源程序文件(后缀为.c), 目标文件(windows环境后缀为.obj), 可执行程序(windows环境
后缀为.exe)。
//2.2 ——数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件。
在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显
示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理
的就是磁盘上文件。
2.3 ——文件名
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径 + 文件名主干 + 文件后缀
例如: c : \code\test.txt
为了方便起见,文件标识常被称为文件名。
3.———— 文件的打开和关闭
3.1 ——文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名
字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统
声明的,取名FILE.
例如,VS2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
//struct _iobuf {
// char* _ptr;
// int _cnt;
// char* _base;
// int _flag;
// int _file;
// int _charbuf;
// int _bufsiz;
// char* _tmpfname;
//};
//typedef struct _iobuf FILE;
//不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
//每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,
//使用者不必关心细节。
//一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。
//下面我们可以创建一个FILE* 的指针变量:
//定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变
//量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联
//的文件。
//3.2 文件的打开和关闭
//文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
//在编写程序的时候,在打开文件的同时,都会返回一个FILE * 的指针变量指向该文件,也相当于建立了指
//针和文件的关系。
//ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。
打开文件
//FILE * fopen(const char* filename, const char* mode);
关闭文件
//int fclose(FILE* stream);
///* fopen fclose example */
//#include <stdio.h>
//int main()
//{
// FILE* pFile;
// //打开文件
// pFile = fopen("myfile.txt", "w");
// //文件操作
// if (pFile != NULL)
// {
// fputs("fopen example", pFile);
// //关闭文件
// fclose(pFile);
// }
// return 0;
//}
——4. 文件的顺序读写
功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件
——4.1 对比一组函数:
//scanf / fscanf / sscanf
//printf / fprintf / sprintf
//这里演示讲解这句函数的使用和对比