文件操作相关知识

1、为什么使用文件

前面我们在实现通讯录时,每次运行结束后,我们所存储的数据都会消失。这是因为我们将数据存储在栈区、堆区等内存上,而内存是不具有持久性的,程序退出时,权限还给操作系统,这些数据就会丢失。因此我们急需实现数据的持久化,而使用文件可以帮我们把数据存储在电脑的硬盘上,实现数据的保存,数据的持久化。

2、文件的分类

2、1程序文件

源程序 .c    目标文件windows环境下为.obj(object)    可执行程序.exe  (windows环境)等

2、2数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件。(即与程序进行交互、读写数据的文件)

文件操作相关知识_第1张图片

之前我们操作的都是 键盘、屏幕等终端,今天我们操作的是文件 

我们接下来要学习的就是这种交互,读写数据,操作文件的方法。

2、3文件名

文件名包含     文件路径+文件名+文件后缀

文件名全称为文件标识,整体简称为文件名

例如   c:\code\test.txt文本形式

注:有时可能没有路径,因为这个文件可能保存在当前路径下,就默认不显示。

3、文件的打开和关闭

每次打开文件时,会在内存中创建一个文件信息区,它是一个结构体变量,用来存放文件相关信息

文件操作相关知识_第2张图片

系统定义这个结构体变量的类型为FILE,取决于编译器,结构体的成员可能有所差异

我们一般用一个FILE类型的指针来维护这个文件信息区,从而操作、获取文件信息。

打开文件

fopen函数

文件操作相关知识_第3张图片

 第一个参数为文件名,第二个为打开方式。返回FILE*类型的指针(即文件信息区的地址),打开失败,返回NULL。

关闭文件

fclose函数

文件操作相关知识_第4张图片

传入FILE*类型的指针后关闭文件。 

文件操作相关知识_第5张图片

文件操作相关知识_第6张图片

需要注意的是,创建的文件是文本文档的形式,而不是文件夹。

4、文件的顺序读写 

相关函数如下图

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件

1、字符输入输出函数

 fgetc  fputc

文件操作相关知识_第7张图片

从某个文件中获取字符

 文件操作相关知识_第8张图片

 指定某个字符,然后通过FILE指针找到对应文件,写入。

文件操作相关知识_第9张图片

fputc每次写入一个字符,也可以循环多次写入。

顺序读写指读写过程中,每个字符都是按照顺序从前往后读取的,位置是顺序不是随机。

同时,打开方式为w写,下一次打开文件会覆盖掉上一次的内容。

文件操作相关知识_第10张图片

按顺序循环读取字符。

读取失败返回EOF,即文件结束,读不到东西了。

2、文本行输入输出函数

一次操作一行,fgets  fputs

文件操作相关知识_第11张图片

文件操作相关知识_第12张图片

 给出的字符串带有\n,文本才会换行。

文件操作相关知识_第13张图片

文件操作相关知识_第14张图片

 str为目标空间,num为拷贝的字符数,FILE*指向源。

文件操作相关知识_第15张图片

会少读取一个,然后补一个\0 

文件操作相关知识_第16张图片

一次最多读取到一行,前面的\n也被读取,因此打印时可以不加\n

3、格式化输入输出函数

 文件操作相关知识_第17张图片

文件操作相关知识_第18张图片

与printf相似,只差一个文件指针。

format为格式化,format...为可变参数列表,即接收的参数是可变的,类型和数量均可。 

文件操作相关知识_第19张图片

将结构体信息写入文件中。

格式化读取

文件操作相关知识_第20张图片

文件操作相关知识_第21张图片

从文件中格式化读取并打印。

4、内存、文件、终端的关系

文件操作相关知识_第22张图片

5、输入输出流

文件操作相关知识_第23张图片

与各种输出设备交互的成本较高,每个交互原理又不同,因此C语言将交互方法抽象成流的概念,此后,流可以用FILE*来维护,因此我们不需要懂更底层的原理,只需要把数据传入流中,然后完成输出操作。 

文件操作相关知识_第24张图片

从键盘标准输入一个a,标出输出一个a到屏幕上。

因此前三类函数,适用于所有输入输出流,包含标准输入输出和文件输入输出。

而printf和scanf只适用于标准输入输出,即从键盘输入从屏幕输出。

相当于fprintf包含了printf,fscanf包含了scanf 

文件操作相关知识_第25张图片

 6、二进制输入输出函数

刚刚的三类输入输出函数都是文本类数据,我们都能看得懂。但计算机存储的是二进制数据,二进制信息一般人是看不懂的。

二进制输入输出是针对文件的,因此操作时还要打开、关闭文件。

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

单纯的w是写入文本数据,二进制数据需要用wb,即写入二进制数据。

文件操作相关知识_第26张图片

 文件操作相关知识_第27张图片

随然我们看不懂二进制,但可以通过二进制的读取,读取回内存中,然后打印观察。

文件操作相关知识_第28张图片

文件操作相关知识_第29张图片 二进制再读取出来再打印。

7、格式化、文件、字符串IO函数对比

 文件操作相关知识_第30张图片

文件操作相关知识_第31张图片

文件操作相关知识_第32张图片

   这类函数用几个关键点,数据源,数据目的地,是否使用文件-打开关闭文件,是否是标准输入输出,是否包含所有输入输出流,二进制需要注意4个参数

5、文件的随机读写

5.1fseek

文件操作相关知识_第33张图片

 

先在文件中放abcdef6个字母

int main()
{
	FILE* pf=fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	int ch = fgetc(pf);
	printf("%c ", ch);
	ch = fgetc(pf);
	printf("%c ", ch);
	ch = fgetc(pf);
	printf("%c ", ch);
}

 然后一次读取3个字符,此时指针指向d,abc均为顺序读取的结果。此时我们可以用fseek函数进行 随机/指定  读取。

文件操作相关知识_第34张图片

SEEK_SET从起始位置偏移1,即将指针移至b处。

每次fgetc指针+1,fseek可以指定指针的位置 

5.2ftell

文件操作相关知识_第35张图片

返回当前指针的偏移量

文件操作相关知识_第36张图片 

打印完b后指向c,此时偏移量为2。

5.3rewind 

文件操作相关知识_第37张图片

回到起始位置,偏移量为0 

6、文本文件和二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文
本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而
二进制形式输出,则在磁盘上只占4个字节(VS2013测试)


7、feof、ferror 

文件读取结束时,用来判断文件结束的原因是读取失败还是文件结束。

1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数
feof  ferror

8、文件缓冲区

文件操作相关知识_第38张图片

 

目录

1、为什么使用文件

2、文件的分类

2、1程序文件

2、2数据文件

2、3文件名

3、文件的打开和关闭

打开文件

关闭文件

fclose函数

4、文件的顺序读写 

1、字符输入输出函数

2、文本行输入输出函数

3、格式化输入输出函数

 ​编辑

4、内存、文件、终端的关系

5、输入输出流

 6、二进制输入输出函数

7、格式化、文件、字符串IO函数对比

5、文件的随机读写

5.1fseek

5.2ftell

5.3rewind 

6、文本文件和二进制文件

7、feof、ferror 

8、文件缓冲区



 

你可能感兴趣的:(C进阶,c语言)