目录
程序文件:.h .c .obj .exe
数据文件:.txt(写、读)
把文件从内存写入硬盘上:输出操作(以内存角度来看)
从硬盘上读文件:输入操作
文件指针
使用函数fopen函数打开文件后,就会有生成一个文件信息区(FILE类型的结构体),系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,用一个文件指针FILE*返回这个文件信息区的地址
一般都是通过一个FILE的指针来维护这个FILE结构的变量
文件的打开和关闭
fopen(文件名,打开方式)
文件路径:
注意文件拓展名的显示
相对路径
. 表示当前路径
. . 表示上一级路径
当前路径:
上一级路径:
上一级路径的上一级路径:
绝对路径
文件的顺序读写
所有输出流:
分为文件流和标准输出流,以下下代码都是实现文件流的
此处为标准输出流:
流是一个高度抽象的概念,相当于中转站,数据写入流,然后转到外部设备。
在写文件的时候,在需要的时候打开、关闭文件
而scanf 从键盘上读取数据、printf 向屏幕打印数据 直接可以操作,是因为C语言程序只要运行起来就默认打开了三个流:(类型都是FILE*的指针)
1、标准输入流 —— stdin
2、标准输出流 —— stdout
3、标准错误流 —— stderr
fputc:
返回的是ASCII码值
每一次写入字符后,一个标记文件指针状态的指针(不是pf,pf不动)就会往后一位,以方便写入下一个字符
fgetc:
正常的话返回字符的ASCII码值,否则返回EOF
改进:
fputs:
fgets:
num:最多读num-1个,但是遇到换行符就停止
一组语句处理一行
fprintf:
fscanf:
fwrite:
以二进制的方式写进去的
fread:
以二进制的方式读
fread要求读取count个大小为size字节的数据
如果真的读到count个数据,函数返回count
如果没有读到count个数据,函数返回真实读取到的数据个数
sprintf:
把格式化的数据转换成字符串
sscanf:
对比:
scanf / fscanf / sscanf
printf / fprintf / sprintf
第一组:是针对标准输入、输出流的格式化输入、输出函数
第二组:是针对所有输入、输出流(文件流、标准输入、输出流)的格式化输入、输出函数
第三组:sscanf:将字符串转换成格式化的数据
sprintf:将格式化的数据转换成字符串
文件的随机读写
fseek:
根据文件指针的位置和偏移量来定位文件指针
fseek(流,偏移量,起始位置)
有三个选择:文件起始位置、文件当前位置、文件偏移量
ftell:
当前光标所在位置相对于起始位置的偏移量
rewind:
rewind(pf)回到起始位置
文件读取结束的判定
被错误使用的feof:
在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束
而是应用于当文件已经读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
判断文件读取结束:
1、文本文件的读取结束判断
使用fgetc,判断返回值是否为EOF
使用fgets,判断返回值是否为NULL
2、二进制文件读取结束判断
使用fread,判断返回值是否小于函数写入的实际要读的个数
判断是什么原因结束的:
ferror:在文件读取结束后,用来判断文件是否因为读取过程中遇到错误而结束,如果遇到错误会返回一个非0的值
feof:在文件读取结束后,用来判断文件是否因为读取过程中遇到文件末尾而结束