实现上没啥区别,只是文本方式打开时会对换行符做特殊处理,可以看看msdn关于CFile的介绍

解决方案 »

  1.   

    4 文件文件的编码.
    头3个字节(非ASCII)用来区别编码
      

  2.   

    我想知道txt文件有没有和bmp一样的文件头?
      

  3.   

    还有关于linux下面关于文件的权限,owner,group,others之类的是什么方式保存的?它这些文件属性在windows里面会怎么处理掉?
      

  4.   

    那是不是说我将一个文件文件txt转化成二制文件bin是不是只要将后缀改一下就行了呢?
      

  5.   

    1.之所以要区分两种文件模式,是忽悠初学计算机的人.
      比如一篇文章,如果用中文写的,你一看就懂,你就可以蛋疼的定义它为文本模式
      与之对应,同样内容,你用英文写的或者甲骨文写的,你就可以定义为二进制模式
      新华字典你姑且可以定义为"记事本",用对应看这篇文章,就是OK的
      如果你用新华字典来尝试看英文写的文章,你就可以称呼它为乱码.
    2.二种打开方式稍有区别,就是换行代码0D0A表示,文本认为它就是一个字符,二进制认位是2个字符
      你就知道文本有多蛋疼了.
    3.文件头是你规定的数据,你说有就有,没有就没有.文本文件一般区分就是.TXT结尾.
      这其实很忽悠老百姓,我写一个二进制文件,我就用.TXT扩展名,你咬我啊.
    4.你把文本文件看成二进制文件的一种,就可以理解了,世界上本就没有所谓文本,都是吃多了撑出来的.
      

  6.   

    楼主要明白的是无论是文本文件,还是unicode 和ascii 的编码,这些都是文件的解释方式。举个例子,文件里有个单词"apple",那么现在要求用中文模式打开,那么就会显示“苹果”,但是对于的文件内容来说,它还是apple,并没有变,只是解释方式变了。好,来回答lz的问题:
    1、为什么用fopen打开文件要分二制度和文本文件模式?
    这是两种解释方式2、二种打开方式在实现上有什么区别吗?
    与其说打开方式,不如说是文件内容的解释方式。
    二进制就是以字节来读取写入,没有任何的附加动作。
    文本方式对回车和换行符进行了处理,具体参看msdn的这段:
    In text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Therefore, the Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function). 3、文本文件有没有文件头?如果有,它的格式是什么?如果没有,它不就是一个纯01串流吗,我们怎么知道它是文本文件呢?
    没有文件头。4、文件文件的编码是怎么回事呢?unicode 和ascii 的编码 在文件里面是通过什么来区别出来的呢?
    很明显,在文件里并没有文件头或特别的标记。只是解释方式不同。
      

  7.   

    “4、文件文件的编码是怎么回事呢?unicode 和ascii 的编码 在文件里面是通过什么来区别出来的呢?
    很明显,在文件里并没有文件头或特别的标记。只是解释方式不同。”

    头3个字节(非ASCII)用来区别编码
      

  8.   


    刚才确认了一下,确实有标记,但是是两个字节FFFE感谢提醒。
      

  9.   

    /*
    EF BB BF    UTF-8  
    FE FF     UTF-16/UCS-2, little endian  
    FF FE     UTF-16/UCS-2, big endian  
    FF FE 00 00  UTF-32/UCS-4, little endian.  
    00 00 FE FF  UTF-32/UCS-4, big-endian.
    */
      

  10.   

     大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
     简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。从上面可以看出文本文件基本上是定长编码的(也有非定长的编码如UTF-8),基于字符嘛,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统有关,所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows.C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.总地来说,从编程的角度来说,C中文本或二进制读写都是缓冲区与文件中二进制流的交互,只是文本读写时有回车换行的转换.所以当写缓冲区中无换行符''\n''(0AH),文本写与二进制写的结果是一样的,同理,当文件中不存在''\r\n''(0DH0AH)时,文本读与二进制读的结果一样.
      

  11.   

    对于内容为 “Ab123\r\n" 二进制(转化为16进制)码为(41 62 31 32 33 0D 0A)的文件,
    pf1 = fopen("f:\\1.txt","r");//或者pf1 = fopen("f:\\1.txt","rb");
    for(int i=0;i <6;i++){
       fread(&a[i],1,1,pf1);
       printf("%0X ",a[i]);
    }
    fclose(pf1);//关闭文件的结果分别为:
    41 62 31 32 33 0A          和     41 62 31 32 33 0D  
    5678的存储形式为:ASCII码:    00110101   00110110   00110111   00111000  (四个字节)
    5678的存储形式为:二进制:      00010110   00101110  (两个字节)
    二进制文件和文本文件的唯一差异就是前者含有一些非标准输出的ASCII码。0x01就是非标准输出的ASCII码,0x61就是标准输出的ASCII码。)
      

  12.   

    文件都是文件,其设备存取都是以字节为单位的,没有区别区别在数据存取之外
    文本文件通常以 .txt作为扩展名,其内容为自然语言的简单记录数据,自然语言分为英语和其它语言两种,对于其它语言,常常会涉及到编码问题,所以衍生出了BOM
    早期的文本文件只包可打印的ASCII字符和极少的几个文本控制符号,那时的计算机输出设备还不支持图形...理论上,所有的文件都是二进制文件,文本文件是其中的一个特例
      

  13.   

    实质是没有区别的,你也可以自己写一个二进制的TXT文件,只是文本文件读取时的回车换行符可以自动解释
      

  14.   

    会不会存在二义性呢?比如ASCII编码的头二个字节刚好是FE FF,那岂不是会解释成了 UTF-16?
      

  15.   

    推荐使用WinHex软件查看文件或内存中的原始字节内容。不要把
    fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

    fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
    弄混了
      

  16.   

    每天一个贴。我只知道,差别就是文本模式的\r\n,和二进制模式的\n关键点是用什么模式写就用什么模式读,网络传输的时候也是一样。怎么读的怎么写。
      

  17.   


    楼上都说的很清楚了.
    txt方式打开 是可见字符.
    bin 是二进制.不是可见字符.
      

  18.   

    简单点讲,就是所有文件都是以二进制保存,而文本文件就是文本内容直接显示,非文本内容自动进行解释(回车,换行符,Tab符之类不可见的符号自动处理掉)。