博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
尽量不要使用文本模式
阅读量:6426 次
发布时间:2019-06-23

本文共 1219 字,大约阅读时间需要 4 分钟。

 当我们使用C的库函数读取文件时,会有文本模式和二进制模式两种读取模式。一些传输数据的协议比如TFTP、FTP也有文本和二进制模式的区分。既可以使用文本模式也可以使用二进制模式时,尽量使用二进制模式。

   

    文本模式和二进制模式读取文件时,差别主要是在回车换行的处理上,不同系统对回车换行的处理不一致。

    CR:  Carriage Return,  0X0D,   “/r”

LF:  Line Feed,         0X0A,   “/n”

Dos和windows采用回车+换行(CR+LG)表示下一行

UNIX采用换行符(LF)表示下一行

MAC机采用回车符(CR)表示下一行

 

    Unix、Linux的C的库函数处理文件时不区分文本和二进制,但是Windows系统下C的库函数读取和写入文本文件时会自动处理回车换行。(测试通过)Windows下以文本模式读取文件时,读取到0D0A时会跳过0D,比如文件内容是0D 0D 0A 0A,则读取到的是0D 0A 0A;

以文本模式写文件时,会自动在每个0A前面加上0D,如果读取到的是 0D 0A 0A,

则写入到文件中的是 0D 0D 0A 0D 0A。我们可以看出文件内容发生了变化,与文件原来的内容已经不同了。

 

具体Windows下C运行库如何处理可以参考VC2005附带的C运行库的源代码。

文本模式下读取文件时处理回车换行的代码在/VC/crt/src/read.c 的265~356行。

Line:291 /* *p is CR, so must check next char for LF */

 if (p < (char *)buf + bytes_read - 1) {

       if (*(p+1) == LF) {

             p += 2;

             *q++ = LF;  /* convert CR-LF to LF */

        }

        else

            *q++ = *p++;    /* store char normally */

    }

文本模式下写文件时处理回车换行的代码在/VC/crt/src/write.c 的268~308行。

Line:282 /* fill the lf buf, except maybe last char */

while ( q - lfbuf < sizeof(lfbuf) - 1 &&

              (unsigned)(p - (char *)buf) < cnt ) {

            ch = *p++;

            if ( ch == LF ) {

                  ++lfcount;

                  *q++ = CR;

            }

            *q++ = ch;

       }

   

   Windows下文本模式打开文件时,要慎用ftell()函数。由于ftell()函数实现中对LF进行了特殊处理,导致ftell()返回的结果可能不是我们需要。

使用二进制模式可以保证文件的内容没有被修改,在需要进行特殊处理的地方我们自己可以进行特殊的处理,而类库自作聪明的处理很多时候反而弄巧成拙。

 

转自:

转载地址:http://fayga.baihongyu.com/

你可能感兴趣的文章
cocos2dx内存管理机制
查看>>
C语言中的内存分配
查看>>
Java异常处理-----运行时异常(RuntimeException)
查看>>
7、Libgdx网络操作
查看>>
普通电视串口 安装使用
查看>>
【学习/模板】tarjan割点
查看>>
PHP中常用的魔术方法
查看>>
C#反射----字段
查看>>
C#json操作
查看>>
基于openssl的单向和双向认证
查看>>
SpringMVC-核心配置文件spring-mvc.xml
查看>>
前一天作业讲解、pycharm使用、格式化输出、逻辑运算符
查看>>
Windows 8 系列(六):BackgroundTask 及其引起无法捕获的Crash
查看>>
老王学linux-文件权限
查看>>
IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统...
查看>>
图灵访谈之三:田春谈Lisp
查看>>
Windows 10 聚焦企业:安全程度更高、更新速度更快
查看>>
resin启动脚本
查看>>
Hypervisors的分类
查看>>
常用的数学函数
查看>>