zoukankan      html  css  js  c++  java
  • 尽量不要使用文本模式

     当我们使用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://blog.csdn.net/someonea/article/details/2160378

  • 相关阅读:
    _bzoj1061 [Noi2008]志愿者招募【最小费用最大流】
    _bzoj2243 [SDOI2011]染色【树链剖分】
    _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
    _bzoj1002 [FJOI2007]轮状病毒【瞎搞】
    leetcode 273 Integer to English Words
    leetcode 12 Integer to Roman
    leetcode 1071 Greatest Common Divisor of Strings
    lc6 ZigZag Conversion
    lc13 Roman to Integer
    leetcode 171 Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2782642.html
Copyright © 2011-2022 走看看