问文本 I/O 和二进制 I/O 有什么区别?
答在文本模式下,文件被假定为由可打印字符行组成(可能包括制表符)。stdio 库中的例程(getc, putc以及其他所有例程)会在底层系统的行结束符表示和 C 程序中使用的单个\n之间进行转换。因此,简单地读取和写入文本的 C 程序不必担心底层系统的换行符约定:当 C 程序写入一个'\n'时,stdio 库会写入适当的行结束指示;当 stdio 库在读取时检测到行结束时,它会向调用程序返回一个单独的'\n'。 [脚注]
另一方面,在二进制模式下,程序和文件之间会按原样读写字节,没有任何解释。(在 MS-DOS 系统上,二进制模式还会关闭对 Ctrl-Z 作为带内文件结束符字符的测试。)
文本模式的转换还会影响读取文件时文件大小的显示。由于在文本模式下读写文件的字符不一定与文件中存储的字符完全匹配,因此磁盘上文件的大小可能不总是等于可以从中读取的字符数。此外,出于类似的原因,fseek和ftell函数不一定处理从文件开头开始的纯字节偏移量。(严格来说,在文本模式下,fseek和ftell使用的偏移量值不应被解释:由ftell返回的值只能作为稍后传递给fseek的参数,并且*只有*由ftell返回的值才能用作传递给fseek.)
的参数。在二进制模式下,fseek和ftell确实使用纯字节偏移量。但是,某些系统可能不得不在二进制文件末尾附加一些空字节以填充为完整的记录。)
参考:ISO Sec. 7.9.2
Rationale Sec. 4.9.2
H&S Sec. 15 p. 344, Sec. 15.2.1 p. 348