目录
什么是文件
磁盘(硬盘)上的文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类
的)。
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。
文件名
数据文件
数据文件被称为二进制文件或者文本文件。
1. 二进制文件:数据在内存中以二进制的形式存储,不加转换的输出到外存的文件中就是二进制文件。
2. 文本文件:在存储前转换,在外存上以ASCII码值的形式存储。
数据文件在内存中的存储
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2019测试)。
流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出 操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。
标准流
在一个C程序中,C语言默认启动三个流
scanf就是从标准输入流中读取数据,printf将信息输出到标准输出流
这三个流的类型是:FILE*,称为文件指针类型
文件的打开和关闭
对文件的操作包括:1、打开文件 2、对文件进行写入或读取 3、关闭文件
ANSI C规定使用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+”(读
写)
|
打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写
|
建⽴⼀个新的⽂件
|
顺序读写函数:
文件打开后,对文件进行操作有许多的函数如下:
以下函数读者可以去这个网站Reference - C++ Reference (cplusplus.com)自行去了解
函数名
|
功能
|
适⽤于
|
---|---|---|
fgetc
|
字符输⼊函数
|
所有输⼊流
|
fputc
|
字符输出函数
|
所有输出流
|
fgets
|
⽂本⾏输⼊函数
|
所有输⼊流
|
fputs
|
⽂本⾏输出函数
|
所有输出流
|
fscanf
|
格式化输⼊函数
|
所有输⼊流
|
fprintf
|
格式化输出函数
|
所有输出流
|
fread
|
⼆进制输⼊
|
⽂件
|
fwrite
|
⼆进制输出
|
⽂件
|
练习
将文件information.txt中的数据复制到文件copy_information.txt中去:
按上图所示先在这个项目的路径下创两个文件夹, information.txt文件 是 copy_information.txt 文件的复制数据的对象,copy_information.txt 文件作为一个空文件,information.txt文件中随便输入一些数据,这里举例输入Hello world
//fgets函数与fputs函数
#include <stdio.h>
int main() {
FILE* fp1 = fopen("information.txt", "r");//读
FILE* fp2 = fopen("copy_information.txt", "w");//写
char str[30];
if (fp1 != NULL) {
fgets(str, 30, fp1);//读出fp1流中的30个字节大小的数据存放到数组str中
fputs(str, fp2);//将数组str中的数据存放到流fp2中
}
perror("");
if (fp1 != NULL)
fclose(fp1);
fclose(fp2);
return 0;
}
运行上述代码可发现, information.txt 文件中的内容成功复制到了copy_information.txt 文件中去