【C语言】文件操作

1、为什么使用文件

因为如果没有文件,我们写的程序运行起来的数据内存就没有地方放置,结束程序后,内存就会被回收,数据就会丢失,等下次运行程序就看不到上次运行程序的数据,如果要将数据永久化保存,就可以用到文件

2、什么是文件

正常来说,文件是硬盘上的文件
在程序设计中,从文件功能来分类来说,文件分为俩种:程序文件、数据文件

2.1程序文件

程序文件包含源程序.c,目标文件.obj,可执行程序.exe;

2.2数据文件

文件内容不一定是程序,也有可能是程序运行时读写的数据,就比如程序运行时需要读取数据的文件,或者输出内容的文件。

2.3文件名

一个文件要有一个唯一的文件标识,以便用户识别和应用;
文件名包含3部分:

文件路径+文件名主干+文件后缀
例如:c:\vs\data.txt

文件标识通常被称为文件名

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

数据文件又分为文本文件或者二进制文件(根据数据的组织形式);
数据在内存中是以二进制的形式储存的,如果不加以转换到外部内存就是二进制文件(我们看到的就会是乱码,没有可读性);
如果在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII码的形式存储的文件是文本文件(呈现我们看的懂的数据,拥有可读性)
测试代码:

int main()
{
	int a = 10000;
	FILE* PF = fopen("test.txt", "wb");
	fwrite(&a, 4, 1, PF);
	fclose(PF);
	PF = NULL;
	return 0;
}

【C语言】文件操作_第1张图片
【C语言】文件操作_第2张图片
在vs上打开二进制文件的方法
【C语言】文件操作_第3张图片
10000在二进制文件上的展示

4、文件的打开和关闭

4.1流和标准流

4.1.1流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

4.1.2标准流

那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语⾔程序在启动的时候,默认打开了3个流:

• stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
• stdout -标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。
• stderr -标准错误流,⼤多数环境中输出到显⽰器界⾯。

我们使用scanf和printf就可以直接进行输入输出操作了。
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为⽂件指针
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

4.2文件指针

文件指针就是文件类型指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放相关信息。这些信息是存在一个结构体变量中的,这些结构体由系统统一声明,取名为FILE
不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
每当打开⼀个⽂件的时候,系统会根据⽂件的情况⾃动创建⼀个FILE结构的变量,并填充其中的信息,使⽤者不必关⼼细节。
我们可以通过⽂件指针变量能够间接找到与它关联的⽂件,如下图;
【C语言】文件操作_第4张图片

4.3文件的打开和关闭

文件在读写之前应该打开文件,读写完后应该关闭文件
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );

mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:

“r”(只读) 为了输⼊数据,打开⼀个已经存在的⽂本⽂件 出错
“w”(只写) 为了输出数据,打开⼀个⽂本⽂件 建⽴⼀个新的⽂件
“a”(追加) 向⽂本⽂件尾添加数据 建⽴⼀个新的⽂件
“rb”(只读) 为了输⼊数据,打开⼀个⼆进制⽂件 出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件 建⽴⼀个新的⽂件
“ab”(追加) 向⼀个⼆进制⽂件尾添加数据 建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件 出错
“w+”(读写) 为了读和写,建议⼀个新的⽂件 建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写 建⽴⼀个新的⽂件
“rb+”(读写) 为了读和写打开⼀个⼆进制⽂件 出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件 建⽴⼀个新的⽂件 “ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件

5、文件的顺序读写

5.1顺序读写函数的介绍

fgetc 字符输⼊函数 所有输⼊流
fputc 字符输出函数 所有输出流
fgets ⽂本⾏输⼊函数 所有输⼊流
fputs⽂本⾏输出函数 所有输出流
fscanf 格式化输⼊函数 所有输⼊流
fprintf 格式化输出函数 所有输出流
fread ⼆进制输⼊⽂件
fwrite ⼆进制输出 ⽂件

上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。

6、文件读取结束的判定

6.1被错误使⽤的 feof

牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。
feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

  1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

• fgetc 判断是否为 EOF .
• fgets 判断返回值是否为 NULL .

  1. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

你可能感兴趣的:(C语言,c语言,linux,服务器)