一.文件存储在磁盘上。常见的磁盘有磁盘C、磁盘D。
二.文件分类:程序文件、数据文件
常见的程序文件:源程序文件(.c文件,编译编写的程序)、目标文件(.obj文件)、可执行文件(.exe文件)
数据文件:程序文件写入数据到A文件,程序文件从B文件读取数据,像A文件、B文件这样的称为数据文件
文件名有一些不能使用的符号
文件名可以不含后缀名
文件后缀表示文件打开方式
文件路径是文件从盘符到找到文件通过的路径的所有符号的集合
四.关于文件的打开和关闭
@1.文件的打开相关函数
a.头文件:
b.第一个参数是打开文件的路径(相对路径或者绝对路径),第二个参数是打开的方式,注意是以字符串的形式表示的
c.关于常见的打开文件的方式
在选择"w"的打开方式,这次所写入的数据会完全覆盖原先的数据。
@2.文件的关闭相关函数
a.头文件:
关于文件的打开和关闭使用操作如下图所示
代码执行前
代码执行后
可以发现新创建了一个text.txt文件
五.文件的顺序函数
1.fgetc()函数
a.头文件:
b.功能:从文件中读取一个字符
c.使用
2.fputc()函数
a.头文件:
b.功能:向文件中写入一个字符
c.解析:第一个参数表示写入文件的字符
程序执行后:
3.fgets()函数
a.头文件:
b.功能:从文件中读取一行字符
c.解析:第一个表示要存储读取的字符串的地址,第二个参数表示要读取字符串的字符个数
d.使用
4.fputs()函数
a.头文件:
b.功能:向文件中写入一行数据
c.解析:第一个参数表示写入文件的字符串
d.使用:
程序执行前:
5.fprintf()函数--格式化输出函数
a.头文件:
b.功能:向文件中写入一行格式化的数据
c.使用:
程序执行前:
程序执行后:
6.fscanf()函数--格式化输入函数
a.头文件:
b.功能:从文件中读取格式化的数据
d.使用:
这里少了struct Stu的定义
7.fread()函数 --二进制输入函数
a.头文件:
b.功能:从文件中读取二进制形式存储的数据
c.解析:第一个参数表示存储以二进制形式存储的数据地址 ,第二个参数表示要读取以二进制数据存储的每个元素的大小,第三个参数表示要读取以二进制数据存储的元素的个数
d.使用:
8.fwrite()函数
a.头文件:
b.功能:向文件中写入数据转换位二进制
c.解析:第一个参数表示存储以二进制形式存储的数据地址 ,第二个参数表示以二进制数据存储的每个元素的大小,第三个参数表示以二进制数据存储的元素的个数
d.使用:
由于是以二进制的方式写入数据,所以在选取写入方式时应该最好用"wb",而不是"w"。
程序执行前:
程序执行后:
因为是以二进制形式存储,其中一些规则我们现在还是不了解的,所以当文本输出你不认识的内容也是正常的,不要慌张。
如果你想看的懂该二进制形式存储的文件,首先在vs编译器中添加文本文件到目录。鼠标右击文件,点开打开方式,选择二进制编译器,就出现了以下的页面。
这样,你就可以根据二进制数字的排序读出相应的ASCII码,解密为你所熟悉的文本形式。
为什么向文件输入数据、从文件中读取数据和函数名称恰恰相反。比如fprintf(),printf表示输出,为什么这个函数确实向文件写入数据呢?
这就要究其本质了。
****一些常见的默认流:1.stdin--标准输入流(键盘)
2.stdout--标准输出流(屏幕)
3. stderr--标准错误流(屏幕)
()内代表的是与流对接的外部设备。
此外,前六个文件函数针对于所有输出输入流,而fread、fwrite函数是只针对于文件的。
关于文件这部分的知识我在学校真的是从未接触过的,但是不能着急,得要慢慢接触理解,像有耐心地对待一个陌生人,时间久了你不仅对他/她更熟悉了解,而且会发现他/她更多的闪光点。
七.文件的随机读写
1.fseek()函数
a.功能:
根据文件指针与指定位置的偏移量来定位文件指针
b.使用:
2.ftell()函数
a.功能:告知程序员当前文件指针与起始地址的偏移量
b.使用:
3.rewind()函数
a.功能:使文件指针重回起始地址
b.使用:
八.详解比较相近的文件函数
1.sscanf()函数
a.头文件:
b.功能:将字符串转化为格式化的数据
c.使用:
2.sprintf()函数
a.头文件:
b.功能:将格式化数据转换为字符串
c.使用:
3.scanf 是针对标准输入(键盘)的格式化输入语句
printf 是针对标准输出(屏幕)的格式化输出语句
fscanf 是针对所有输入流的格式化输入语句
fprintf 是针对所有输出流的格式化输出语句
fscanf、fprintf的输入输出是针对程序而言的
sscanf 是可以将字符串转换为格式化数据的输入语句
sprintf 是可以将格式化数据转换为字符串的输出语句
sscanf、sprintf的输入输出是针对于程序而言,且不针对文件
九.文本文件和二进制文件
文本文件:以ASCII码值存储的方式存储数据的文件
二进制文件:以二进制存储的方式存储数据的文件
注:字符型以ASCII码值形式存储;数值既可以ASCII码值存储,也可以二进制形式存储,不同的情况各有利弊。
比如,整型数10000,ASCII码值存储占五个字节,二进制形式存储占四个字节。
整型数10,ASCII码值存储占两个字节,二进制形式存储占四个字节。
十.被误解的feof()函数
feof()函数功能:是在已经得知文件读取结束时判断因为什么原因而结束,并不是直接判断文件是否读取结束。通常与ferror()函数配套使用,feof()函数判文件是因为读到文件结束而不继续读,而ferror()函数是因为读取出错而不再读取。
判断文件读取结束的标志:1.文本文件是否已经结束,可以使用fgetc()函数得到的值是否为EOF,若为EOF则证明文件读取结束。
2.文本文件是否已经结束,可以使用fgets()函数得到的指针是否为NULL,若为NULL则证明文件读取结束。
3. 二进制文件是否已经结束,可以使用fread()函数返回的值(即成功读取到元素的个数)小于要读取的元素的个数,若为小于则证明文件读取结束。
十一.文件缓冲区
内存向硬盘中传输数据,只有当数据填满文件缓冲区时,数据才会传输。相当于货物装满货车,货车才发动开往目的地。
注意:fclose()函数在关闭文件的时候会刷新缓冲区,将缓冲区上的数据传输。
测试缓冲区存在的程序如图所示: