标准IO由ANSI C库说明,在很多系统都实现了标准IO库。标准IO库处理很多细节,如缓冲的分配、优化长度执行IO等,使得用户不需要考虑选择合适的长度。标准IO是在系统调用函数构建的,便于用户使用。
标准IO的所有操作都是围绕流(stream)来进行的,在标准IO中,这种流用FILE*描述。
流一般分为文本流和二进制流,文本流中的数据以字符的形式存在,通常基于字符编码。二进制流中的数据则以二进制数字序列的形式存在。如果一个流中含有数字,二进制流会用相应的二进制数表示;如果流中有字符,则用一个字节的二进制ASCII码表示。
从存储和传输效率的角度看,二进制流相较于文本流具有显著优势。因为二进制流在表示数据时不需要进行字符到数字的转换,所以它可以更直接、更紧凑地表示数据,从而节省存储空间并提高处理速度。例如,数字“2001”在文本流中需要用其ASCII码表示为四个字符,即'2'、'0'、'0'、'1',共占4字节。而在二进制流中,它只需要表示为“00000111 11010001”,用十六进制表示就是“07D1”,只占两字节。
文本文件和二进制文件在逻辑上也有所不同。文本文件是基于字符编码的文件,而二进制文件则是基于值编码的文件。这意味着在二进制文件中,你可以根据具体应用指定某个值的意义,这可以看作是自定义编码。因此,二进制文件在编码层次上具有更大的灵活性。
FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的相关信息,这些信息保存在一个结构体中,该结构体由系统定义命名为FILE。
标准IO提供了三种类型的缓存方式——全缓存、行缓存、无缓存。
全缓存:当缓存区满,或者满足一定条件后就可刷新缓存区(fflush)。
行缓存:当终端行满或者遇到换行符时进行刷新缓存区(fflush)。
无缓存:标准IO库不对字符进行缓存,如stderr。
标准IO也预定义三个流,分别是stdin、stdout、stderr,标准输入、标准输出、标准错误输出。
使用fopen函数打开文件,第一个参数为文件的路径名,第二个参数对文件操作的权限,对文件进行只读操作时,使用r(文件必须存在),只写,使用w(文件不存在时则创建,会擦除文件内容),追加使用a(文件不存在则创建)。当第二个参数有b时,表示以二进制方式打开。
以流方式打开文件后,可以通过下面三种非格式化方式对文件进行读写操作。
使用fgetc和fputc对文件进行一个字符的读写,每次读取后文件指针向后偏移一位。
使用fgets和fputs对文件进行一行读写。
使用fread和fwrite对文件进行数量和块的读写。
可使用feof判断文件是否结束。
EOF为文件结束的返回标志。
ferror可以检验文件是否出错。