C中fopen的mode参数中,b的使用区别
来源:互联网 发布:找不到usb打印机端口 编辑:程序博客网 时间:2024/06/05 09:33
其中主要的内容要看下面:
但是,所谓使用fopen标志打开文本文件与二进制文件的说法并不准确。正确的说法应该是--以文本方式和二进制方式打开文件。因为我们用两种方式都可以任意的文件。
即使这样,为什么还要区分两种方式呢?
这是因为这两种方式在读写文件时的操作是不一样的。
二进制方式很简单,读文件时,会原封不动的读出文件的全部內容,写的時候,也是把內存缓冲区的內容原封不动的写到文件中。
而文本方式就不一样了,在写文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。
所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或內容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。
要特別注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,沒有文本方式和二进制方式的区分,使不使用'b'标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。
如上文已提到,DOS和Windows系统使用CRLF(0x0D 0x0A)双字节作为文本文件换行符,而Unix文本文件的换行符只有一个字节LF(0x0A)为。在C语言中,也是以LF即'/n'为换行符。
由于DOS/Windows定义的换行符和C语言的不一致,C语言的标准输入输出函数适行读写文本文件时,就适行了CRLF->LF的转换。而Unix的定义和C语言的是一样的,就不必转换了。
那么,为什么會有定义不一致的情况呢,这纯属历史原因。当初C是在Unix上发展的,对换行的定义自然就一样了。其后C被引入到DOS系统,为了使原有的C程序能不加修改的读写DOS的文本文件,所以就在文件读写上做了修改。随着DOS/Windows成为主流平台,这个当初为了兼容而做的修改給众多的C语言开发者添了这样一个小小的麻烦。
- C中fopen的mode参数中,b的使用区别
- C中fopen的mode参数中,b的使用区别
- fopen参数中有b与没有b的区别
- fopen()函数中参数mode的取值
- C基础——fopen() 的 mode参数
- C中fopen打开方式r和rb的区别
- C语言中open与fopen的区别
- fopen中r+和w+的区别
- fopen中w和wb的区别
- linux 中 open和fopen的区别
- linux 中 open和fopen的区别
- linux 中 open和fopen的区别:
- fopen()中w 和w+的区别
- fopen中r+和w+的区别
- fopen()中w 和w+的区别
- PHP中fopen,file_get_contents,curl的区别
- 《c和指针》笔记--不能小看了fopen的mode参数
- C语言中fopen的一般用法
- kettle组件开发小结
- Windows 7英文版访问2003或XP共享时提示用户名密码错误的解决办法
- ORA-01691: Lob 段 INSPECT.SYS_LOB0000052587C00011$$ 无法通过 8192 (在表空间 USERS 中) 扩展
- Could not find default endpoint element that references contract 'wcfXXXXXXXXXXX' in the ServiceMode
- 内部类(补充)
- C中fopen的mode参数中,b的使用区别
- magento在同一个页面实现登陆注册
- 岁月
- CTL_CODE 定义说明(重要理解内容)
- UITableView 美化- 增加一个好看的背景
- 文件适配器(1)
- 产生随机数
- 关于MySQL中的timestamp类型
- 闲着……学学写写汇编(只贴代码)(5)