1.文件
a. 文件是什么?
i. 文件是磁盘或者固态硬盘上的一段已命名的存储区
b. 什么是文本文件和二进制文件?
i. 文本文件和二进制文件都是计算机文件,在计算机中的物理存储都是二进制的,没有本质的区别;
真正的区别是在逻辑上的,也就是编码层次上的差异。
ii. 文本文件是以ASCII码、Unicode码表示的纯文本文件,只能存储字符信息,不能存储其他信息;
二进制文件主要是图形文件和文字处理程序等计算机程序
iii. 文本文件大多是定长编码,每个字符在具体编码中是固定的;二进制文件是基于值编码,根据不
同的应用,代表不同的信息,自定义的编码,是变长编码,一个值由多少个比特代表完全由自己
决定,所以不同的编辑器去打开二进制文件,很容易产生乱码,因为编码和译码的格式不一样
c. 什么是二进制模式和文本模式?
i. 这个是C语言提供的两种访问文件的途径
1) 在二进制模式中,程序可以访问文件的每个字节,故访问的内容就是文件中存放的内容
2) 在文本模式中,程序所见的内容与文本实际内容不同。文本模式中,程序会把本地环境表示的行
末尾或者文件末尾转换为C中的格式
2.文件相关函数(文件结构包含文件和其他的一些信息)
○ FILE *fopen( const char *restrict filename, const char *restrict mode );
§ 参数1--->指向文件名的指针、参数2--->决定打开文件模式的模式字符串、返回一个指向文件结构的指针
○ int getc( FILE *stream );
§ 从stream指定的文件结构获取下一个字符
○ int putc( int ch, FILE *stream );
§ 将字符ch写入到stream指向的文件结构中去、ch应该是unsigned char
○ int fclose( FILE *stream );
§ 关闭stream指向的文件结构
○ int fprintf( FILE *restrict stream, const char *restrict format, ... );
§ 将数据格式化输出到文件流stream
○ int fscanf( FILE *restrict stream, const char *restrict format, ... );
§ 从stream文件流格式化输入数据
○ long ftell( FILE *stream );
§ (二进制打开文件)获得此时文件位置指示器距离文件开始处的字节数(文件第一个字节到文件开始处的位置是0)
§ (文本模式打开文件)若流以文本模式打开,则由此函数返回的值无意义,且仅若作为 fseek() 的输入才有意义。
§ 成功时为文件位置指示器,若失败发生则为 EOF 。
○ int fseek( FILE *stream, long offset, int origin );
§ 设置stream的文件的文件位置指针的位置为origin+offset
§ 成功时返回0,否则非0
○ int fgetpos( FILE *restrict stream, fpos_t *restrict pos );
§ 用于处理较大的文件
§ fpos_t是一种新类型---文件定位类型,其变量可以在文件中指定一个位置,不能是数组类型
§ 获得文件流 stream 的文件位置指示器和当前分析状态(若存在),并将它们存储于 pos 所指向的对象
§ 成功返回0,否则返回非0
○ int fsetpos( FILE *stream, const fpos_t *pos );
§ 用于处理较大文件
§ 与fgetpos函数功能相呼应
§ 根据pos 所指向的值,设置文件流 stream 的文件位置指示器和多字节分析状态(若存在)
§ 成功返回0,否则返回非0
3.标准I/O的机理
a. fopen打开一个文件做了如下几项工作(打开了一个流)
i. 打开一个文件
ii. 创建一个缓冲区
iii. 创建一个结构(文件流)结构内有以下成员
1) 一个指定流当前位置的文件位置指示器
2) 一个错误指示器
3) 一个文件结尾指示器
4) 一个指向缓冲区开始处的指针
5) 一个文件标识符(这个就代表文件了吧)
6) 一个计数器(用于统计实际拷贝进缓冲区的字节数)
iv. 返回一个指向该结构的指针fp
b. 调用文件输入函数
i. 文件中的数据会被拷贝进缓冲区
ii. 初始化fp所指向的结构中的值
1) 当前位置指示器(一般从0开始)
2) 拷贝进缓冲区的字节数
iii. 从缓冲区读取数据
iv. 文件位置指示器自动指向刚被读取的那个字符
v. 拷贝完当前缓冲区数据后,会请求将文件中的而其他数据拷贝进缓冲区,一次读取文件数据直至读取到文件结尾
vi. 读到文件结尾时,文件结尾指示器为真
vii. 下次在尝试读取数据时庙会返回EOF