13.9 总结

向文件写入和从文件读出对于大多数C程序来说都是必需的。大多数C实现为这一目的提供了低级I/O服务和标准高级I/O服务。因为ANSI C库中包括了标准I/O服务而不是低级服务,所以标准服务包的可移植性更好。

标准I/O包自动创建输入输出缓冲区以加快数据传输的速度。fopen()函数为标准I/O打开一个文件,并创建一个用于存放有关文件和缓冲区信息的数据结构。fopen()函数返回指向这一数据结构的指针,其他函数可以用这个指针来指定要处理的文件。feof()和ferror()函数报告I/O操作失败的原因。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

C将输入看作字节流。如果使用fread(), C将输入看作要被放置到指定存储位置的二进制值。如果使用fscanf()、getc()、scanf(),或其他相关函数,C将每个字节看作一个字符编码。fscanf()和scanf()于是尝试将字符编码翻译成格式说明符指定的其他类型。例如,%f说明符会将输入23翻译成为一个浮点值,%d说明符会将该输入翻译成为一个整数值,而%8说明符则会将这个字符输入保存为一个字符串。getc()和fgets()系列函数将输入保持为字符编码,把它作为独立的字符保存在字符变量中,或者作为字符串保存在字符数组中。与之类似,fwrite()将二进制数据直接放到输出流中,而其他的输出函数将非字符数据转换成为字符表示以后再将其放到输出流中。

ANSI C提供两种打开文件的模式:二进制模式和文本模式。以二进制模式打开一个文件时,可以逐字节地读取它。以文本模式打开一个文件时,会把文件内容从具体系统的文本表示法映射到C表示法。对于UNIX和Linux系统,这两种模式是相同的。

输入函数getc()、fgets()、fscanf()和fread()一般从文件头开始顺序读取文件,而fseek()和ftell()函数允许程序移动到文件中任意位置进行随机存取。fgetpos()和fsetpos()函数将这一功能扩展到处理更大的文件。相对于文本模式,随机存取更适合在二进制模式下进行。