当前位置:嗨网首页>书籍在线阅读

20-二进制模式和文本模式

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

13.5.2 二进制模式和文本模式

我们设计的程序清单13.4在UNIX和MS-DOS环境下都可以运行。UNIX只有一种文件格式,所以不需要进行特殊的转换。然而MS-DOS要格外注意。许多MS-DOS编辑器都用Ctrl+Z标记文本文件的结尾。以文本模式打开这样的文件时,C能识别这个作为文件结尾标记的字符。但是,以二进制模式打开相同的文件时,Ctrl+Z字符被看作是文件中的一个字符,而实际的文件结尾符在该字符的后面。文件结尾符可能紧跟在Ctrl+Z字符后面,或者文件中可能用空字符填充,使该文件的大小是256的倍数。在DOS环境下不会打印空字符,程序清单13.4中就包含了防止打印Ctrl+Z字符的代码。

二进制模式和文本模式的另一个不同之处是:MS-DOS用 \r\n 组合表示文本文件换行。以文本模式打开相同的文件时,C程序把 \r\n “看成” \n 。但是,以二进制模式打开该文件时,程序能看见这两个字符。因此,程序清单13.4中还包含了不打印 \r 的代码。通常,UNIX文本文件既没有Ctrl+Z,也没有 \r ,所以这部分代码不会影响大部分UNIX文本文件。

ftell() 函数在文本模式和二进制模式中的工作方式不同。许多系统的文本文件格式与UNIX的模型有很大不同,导致从文件开始处统计的字节数成为一个毫无意义的值。ANSI C规定,对于文本模式, ftell() 返回的值可以作为 fseek() 的第2个参数。对于MS-DOS, ftell() 返回的值把 \r\n 当作一个字节计数。