30.0、C语言——文件操作 (1)
30.0、C语言——文件操作 (1)
什么是文件:
1. 磁盘上的文件是文件;
2. 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件;
程序文件:
包括源程序文件 ( 后缀为 .c ),目标文件 ( windows环境后缀为 .obl ),可执行程序 ( windows环境后缀为 .exe );
数据文件:
文件的内容不一定是程序,而是程序运行时读写的数据;比如程序运行需要从中读取数据的文件,或者输出内容的文件;
本章讨论的是数据文件:
1. 在以前各章所处理数据的输入输出都是以终端为对象,即从终端的键盘输入数据,运行结果显示到显示器上;
2. 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上的文件;
文件名:
1. 一个文件要有一个文件表示,以便用户识别和引用;
2. 文件名包含3个部分:文件路径 + 文件名主干 + 文件后缀;
3. 例如: c : \ code \ test .txt
4. 为了方便起见,文件表示通常被称为文件名;
文件类型:
1. 根据数据的组织形式,数据文件被称为文本文件【文本文件内容是我们都能看懂的字符】或者二进制文件【二进制文件内容是一些随机值、乱码我们看不懂】;
2. 数据在内存中以而精致的形式存储,如果不加转换的输出到外存,就是二进制文件;
3. 如果要求在外存上以 ASCII 码的形式存储,则需要在存储前转换;以ASCII字符的形式存储的文件就是文本文件;
一个数据在内存中是怎么存储的呢?
1. 字符一律以 ASCII 形式存储,数值型数据既可以用 ASCII 形式存储,也可以使用二进制形式存储;
2. 如有整数 10000 ,如果以 ASCII 码的形式输出到磁盘,则磁盘中占用 5 个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占 4 个字节(vs2013测试);如下图所示->
以代码的形式测试一下 ->
int main() {
int a = 10000;
FILE* pf = fopen("test.txt","wb");//这里wb的意思就是以二进制的形式写该文件
fwrite(&a,4,1,pf);//将&a写进去,写4个字节,1个这样的四个字节的数据,,放到 pf指针 维护的这个文件里面去,二进制的形式写到文件中
fclose(pf);//写完之后关闭这个文件
pf = NULL;
return 0;
}
文件缓冲区:
ANSIC 标准采用 “缓冲文件系统” 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。
从内存向磁盘输出数据会先送到内存中的缓冲区;装满缓冲区后才一起送到磁盘上;
如果从磁盘向计算读入数据,则从磁盘文件读取输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区 ( 程序变量等 );
缓冲区的大小根据 C 编译系统决定的;
给大家举个实例:
int main() {
whlie(1) {
sleep(1);
printf("hehe");
}
return 0;
}
在linux中上述这段代码按道理来说运行之后应该是每过1秒就打印一个呵呵,但是我们运行后发现过了一秒什么都没有打印,这是因为程序文件 printf() 和屏幕之间还有一个东西就是输出缓冲区,这个缓冲区要等printf() 充满了之后才会一次性输出;
文件指针:
缓冲文件系统中,关键的概念是 “ 文件类型指针 ”,简称文件指针;
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态以及文件当前的位置等)这些信息是保存在一个结构体变量中的;该结构体类型是有系统声明的,取名 FILE ;
例如: VS2008编译环境提供的 stdio.h 头文件中有以下的文件类型声明
1. 那么不同的C编译器的 FILE 类型包含的内容不完全相同,但是大同小异;
2. 每当打开一个文件的时候,系统会根据文件的情况自动创建一个 FILE 结构的变量,并填充其中的信息,使用者不必关心细节;
3. 一般都是通过一个 FILE 的指针来维护这个 FILE 结构的变量,这样使用起来更加方便;
下面我们可以创建一个 FILE* 的指针变量:
FILE* pf; //文件指针变量
定义 pf 是一个指向 FILE 类型数据的指针变量;可以使 pf 指向某个文件的文件信息区(是一个结构体变量);通过该文件信息区中的信息就能够访问该文件;也就是说,通过文件指针变量能够找到与他关联的文件;