精华内容
下载资源
问答
  • 文本文件和二进制文件在物理上都是以二进制(01)存储的。 不同·写入 以文本方式写文件(w/w+),遇到'\n'字符时,自动转换成'\r''\n',变成2个字符再存 以二进制方式写文件(wb/wb+),遇到'\n'时,不转换,...

    相同点

    文本文件和二进制文件在物理上都是以二进制(01)存储的。

    不同点·写入

    以文本方式写文件(w/w+),遇到'\n'字符时,自动转换成'\r''\n',变成2个字符再存

    以二进制方式写文件(wb/wb+),遇到'\n'时,不转换,直接存该字符

    当写入的数据中有'\n'时,文本方式写文件速度要慢(有转换),写的文件要大(多了'\r')

    不同点·读取

    以文本方式读文件(r/r+),遇到'\r''\n'时,转换成'\n',变成一个字符

    以二进制方式读(rb/rb+),遇到'\r''\n'时,不转换,还是两个字符

    当读取的数据中有''\r'\n'时,文本方式读文件速度要慢(有转换)

    结论

    当你要存入的数据没有'\n'时,无论使用文本还是二进制方式,得到的文件大小都是一样的
    要想压缩文件大小,只能从数据编码下手
    例如 12、14两个数字,就可以存入1个字节(12<<4 | 14)

    建议

    写自定义编码的二进制文件,使用 fwrite 函数

    转载于:https://www.cnblogs.com/TaoyzDream/p/3678013.html

    展开全文
  • 首先要明白一点,就是无论你用哪... 用二进制模式打开一个文件的时候,文件本身的内容你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。  但是如果用了文本模式,那么操作系统在将文件

     首先要明白一点,就是无论你用哪种语言进行程序设计,也无论你用哪个函数进行文件操作(库函数也好,直接操作系统API也好),最终的文件打开的操作都是由操作系统来进行的,因此各种语言的情况从本质上来说都是相同的。


      用二进制模式打开一个文件的时候,文件本身的内容和你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。

      但是如果用了文本模式,那么操作系统在将文件内容传给上层程序(库函数,或者是你的程序)时,或者上层程序通过操作系统向文件写入内容时,操作系统都会预先进行一层预处理(或者说转义),具体过程依赖于操作系统的实现。在Windows+VC下,最常见就是将回车符"\r\n"(没有引号,且\作转义符用,下同)解释成"\n"(读出时),将"\n"解释成"\r\n"(写入时)。而在Linux下没有这层转换,这也是Windows和Linux文本文件不通用的原因。

      除此以外,两种打开方式其实是大同小异的。
      举个例子,设有一文件file.dat内容为"ABC\r\nABC",那么在下面的代码中,读到的内容将是"ABC\r\nABC":
      fp = fopen("file.dat","rb"); 
      while(fgetc(fp)!=EOF);
      而在下面的代码中,读到的内容却是"ABC\nABC":
      fp = fopen("file.dat","rt"); 
      while(fgetc(fp)!=EOF);

      还有一点要注意的是关于文件定位的问题。在文本模式下最好少用fseek,因为有了库函数的那层转义的存在,fseek会有一些近乎于奇怪的行为。我在Windows+VC下试验发现,尽管在文本模式下"\r\n"还是被当作两个字符计算的,但是当你把文件指针定位到"\r\n"处时,读到的两个字节都是"\n"。

     

            C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.

     

     

    二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。下面我用个例子来说明。
    我们定义了一个结构体,表示一个学生信息,我们打算把学生的信息分别用二进制和文本的方式写入到文件中。
    struct Student 
    {
        
    int num;
        
    char name[20];
        
    float score;
    };
    我们定义两个方法,分别表示内存写入和文本写入
    //使用二进制写入
    void write_to_binary_file()
    {
        
    struct Student stdu;
        stdu.num 
    = 111;
        sprintf_s(stdu.name,
    20,"%s","shine");
        stdu.score 
    = 80.0f;
        fstream binary_file(
    "test1.dat",ios::out|ios::binary|ios::app); //此处省略文件是否打开失败的判断
        binary_file.write((char *)&stdu,sizeof(struct Student));//二进制写入的方式
        binary_file.close();

    //文本格式写入
    void write_to_text_file()
    {
        
    struct Student stdu;
        stdu.num 
    = 111;
        sprintf_s(stdu.name,
    20,"%s","shine");
        stdu.score 
    = 80.0f;
        FILE 
    *fp = fopen("test2.dat","a+");   //此处省略文件是否打开失败的判断
        fprintf(fp,"%d%s%f",stdu.num,stdu.name,stdu.score); //将数据转换成字符串(字符串的格式可以自己定义)
        fclose(fp);

    //MAIN函数调用前面两个方法
    int _tmain(int argc, _TCHAR* argv[])
    {
        write_to_binary_file();
        write_to_text_file();
        
        
    return 0;
    }
    我们来看下,文件里面的格式 2进制文件

    文本文件


    2进制文件里面将111编码成6F,1个字节,这刚好是111的16进制表示,而文本文件中则写成31,31,31用了3个字节,表示111。73   68   69   6E   65 表示shine,之后2进制文件里是几个连续的FE,而文本文件中是38   30......文本文件将浮点数80.000000用了38(表示8)   30(表示0)  2E(表示.)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0),二进制文件用了4个字节表示浮点数00   00   A0   42
    通过这里我们可以初见端倪了,二进制将数据在内存中的样子原封不动的搬到文件中,文本格式则是将每一个数据转换成字符写入到文件中,他们在大小上,布局上都有着区别。由此可以看出,2进制文件可以从读出来直接用,但是文本文件还多一个“翻译”的过程,因此2进制文件的可移植性好。

    展开全文
  •  用二进制模式打开一个文件的时候,文件本身的内容你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。 但是如果用了文本模式,那么操作系统在将文件内容传给上层程序(库函数,...

    首先要明白一点,就是无论你用哪种语言进行程序设计,也无论你用哪个函数进行文件操作(库函数也好,直接操作系统API也好),最终的文件打开的操作都是由操作系统来进行的,因此各种语言的情况从本质上来说都是相同的。


      用二进制模式打开一个文件的时候,文件本身的内容和你编写程序时用函数读到的内容完全相同(或者说和磁盘上的内容完全相同)。

      但是如果用了文本模式,那么操作系统在将文件内容传给上层程序(库函数,或者是你的程序)时,或者上层程序通过操作系统向文件写入内容时,操作系统都会预先进行一层预处理(或者说转义),具体过程依赖于操作系统的实现。在Windows+VC下,最常见就是将回车符"\r\n"(没有引号,且\作转义符用,下同)解释成"\n"(读出时),将"\n"解释成"\r\n"(写入时)。而在Linux下没有这层转换,这也是Windows和Linux文本文件不通用的原因。

      除此以外,两种打开方式其实是大同小异的。
      举个例子,设有一文件file.dat内容为"ABC\r\nABC",那么在下面的代码中,读到的内容将是"ABC\r\nABC":
      fp = fopen("file.dat","rb"); 
      while(fgetc(fp)!=EOF);
      而在下面的代码中,读到的内容却是"ABC\nABC":
      fp = fopen("file.dat","rt"); 
      while(fgetc(fp)!=EOF);

      还有一点要注意的是关于文件定位的问题。在文本模式下最好少用fseek,因为有了库函数的那层转义的存在,fseek会有一些近乎于奇怪的行为。我在Windows+VC下试验发现,尽管在文本模式下"\r\n"还是被当作两个字符计算的,但是当你把文件指针定位到"\r\n"处时,读到的两个字节都是"\n"。

            C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.

    二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。下面我用个例子来说明。
    我们定义了一个结构体,表示一个学生信息,我们打算把学生的信息分别用二进制和文本的方式写入到文件中。
    struct Student 
    {
        
    int num;
        
    char name[20];
        
    float score;
    };
    我们定义两个方法,分别表示内存写入和文本写入
    //使用二进制写入
    void write_to_binary_file()
    {
        
    struct Student stdu;
        stdu.num 
    = 111;
        sprintf_s(stdu.name,
    20,"%s","shine");
        stdu.score 
    = 80.0f;
        fstream binary_file(
    "test1.dat",ios::out|ios::binary|ios::app); //此处省略文件是否打开失败的判断
        binary_file.write((char *)&stdu,sizeof(struct Student));//二进制写入的方式
        binary_file.close();

    //文本格式写入
    void write_to_text_file()
    {
        
    struct Student stdu;
        stdu.num 
    = 111;
        sprintf_s(stdu.name,
    20,"%s","shine");
        stdu.score 
    = 80.0f;
        FILE 
    *fp = fopen("test2.dat","a+");   //此处省略文件是否打开失败的判断
        fprintf(fp,"%d%s%f",stdu.num,stdu.name,stdu.score); //将数据转换成字符串(字符串的格式可以自己定义)
        fclose(fp);

    //MAIN函数调用前面两个方法
    int _tmain(int argc, _TCHAR* argv[])
    {
        write_to_binary_file();
        write_to_text_file();
        
        
    return 0;
    }
    我们来看下,文件里面的格式 2进制文件

    文本文件

    2进制文件里面将111编码成6F,1个字节,这刚好是111的16进制表示,而文本文件中则写成31,31,31用了3个字节,表示111。73   68   69   6E   65 表示shine,之后2进制文件里是几个连续的FE,而文本文件中是38   30......文本文件将浮点数80.000000用了38(表示8)   30(表示0)  2E(表示.)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0),二进制文件用了4个字节表示浮点数00   00   A0   42
    通过这里我们可以初见端倪了,二进制将数据在内存中的样子原封不动的搬到文件中,文本格式则是将每一个数据转换成字符写入到文件中,他们在大小上,布局上都有着区别。由此可以看出,2进制文件可以从读出来直接用,但是文本文件还多一个“翻译”的过程,因此2进制文件的可移植性好。
    展开全文
  • C语言读取文件文本模式和二进制模式的区别

    千次阅读 多人点赞 2016-07-22 16:14:58
    二进制存储和文本存储完全不相同?对于纯文本必须使用文本模式?对于纯数字必须使用二进制模式?如果你对这些有疑惑,这篇文章适合你,如果你是来看函数时如何使用的,可能你要另寻他处了。 二、明白关键一点  任何...

    一、疑惑

      在学习C语言读取文件的时候,首先学习到的是C语言读取文件时分文本模式和二进制模式。给好多人造成疑惑,文件存储时要分类?二进制存储和文本存储完全不相同?对于纯文本必须使用文本模式?对于纯数字必须使用二进制模式?如果你对这些有疑惑,这篇文章适合你,如果你是来看函数时如何使用的,可能你要另寻他处了。

    二、明白关键一点

      任何数据在内存中或者硬盘上的存储都是1、0组成的序列,从硬盘、内存这个角度看根本不存在什么二进制和文本模式之分。

    三、区别

      稍对C语言操作文件有了解都知道2点:1、首先应该fopen打开文件2、有两类文件操作函数,对应着二进制模式和文本模式。

      两个模式的区别在两个地方,这两个地方的区别正好体现在刚才说的2点上。

      1、 打开文件时选择模式

        使用fopen函数时,要给予第二个参数一个值,告诉fopen使用什么模式打开文件。这里的参数决定的就是第一个区别:对于字符串中的\n如何处理?

         教材中说,文本模式中,在存储\n时要转化为\r\n,读取文件时进行逆转换。二进制模式时,则不进行转换。当然这是在操作系统是Windows的条件下。

        首先我们要知道回车和换行是不相同的,Windows中文字另起一行内存表示为<回车><换行>对应\r\n,而Linux、Unix中则是单单一个<换行>对应\n。Mac中则是一个<回车>对应\r

        C语言起源于Unix的产生,对于文件中的另起一行,Unix采用单个\n表示。所以我们通常在输出一个短话想换行时加一个\n就可以了,Windows也是如此。到了数据从内存到硬盘上进行存储时,对于unix来说,\n照样是\n。而Windows为了防止读取时混乱必须转换为\r\n。Mac呢,就是\r。

        这就是第一区别,这个区别是体现在fopen第二个参数,跟你使用文本模式的函数还是二进制模式的函数根本不相关!你可以做一个实验,使用二进制模式的函对于同样的字符串:”Hello\n”,当fopen使用w参数写入文件,无论是fwrite还是fprintf都会对\n会进行转换,而使用wb参数则都不进行转换。

      2、  两种不同模式的函数

        打开文件后,要进行数据写入。

        教材中说,使用文本模式打开文件,就要用fprintf写入数据,使用二进制模式打开文件,就要用fwrite写入数据。

        其实你用文本模式打开文件,一个字符串,fprintf、fwrite都能写入文件,写入还都是一样的数据。使用两类函数的区别其实在于数字的处理上。

        对于一个数字5,你用fprintf写入,将把数字5转换为字符5,将其对应的ASCII编码存入存储器,占用1个字节。但实际上数字5就是数字5,对应2进制101,整形占用4个字节。fwrite则将这个数字在内存中占用的4个字节全部原样写入到硬盘中,占4个字节。

        而同样对于一段字符串”Hello”,使用ASCII编码对于fprintf和fwrite都能原样写到硬盘中。

        同样对于这个区别,你仍然能做个实验,对于一个int型数字5,你如何用fprintf和fwrite写入到硬盘中,他们对应的十六进制码是多少?对于一段字符串你再用两个函数分别写到硬盘中,你看看对应的十六进制码是什么。这个实验跟你用fopen如何指定第二个参数无关。

    四、总结

      文本模式和二进制模式其实就2个简单的区别,抓住这两个核心完全能搞懂两种模式的不同。

      对于第一个区别完全是因为操作系统的差异导致,C作为一个跨平台的语言必须要设计一种方法解决这个跨平台的问题,如果3个平台对于另起一行这个操作统一是不存在这第一个区别的

      对于第二个区别,一切数据的存储都是二进制1、0存储,只不过对于数字,既可以认为是一个数字,也可以认为是一个字符,这就是产生第二个区别的原因

    展开全文
  • 文件打开的文本模式和二进制模式 首先要明白一点,就是无论你用哪种语言进行程序设计,也无论你用哪个函数进行文件操作(库函数也好,直接操作系统API也好),最终的文件打开的操作都是由操作系统来进行的,因此各种...
  • 文件

    2017-12-16 11:05:41
    2017-8-13 文件 复习完成时间:2017-8-13 ...按编码分:二进制码文件、ASCII码文件(文本文件,存储形式与显示相同,读写费时,占空间大) 2、文件打开与关闭 打开:FILE *fp;//定义一个指向文件的指针  fp=fopen(“c:
  • PHP接口上传文件图片详解

    千次阅读 2019-12-27 11:36:49
    简介   PHP在处理POST文件上传使用一个文件上传变量$_FILES $HTTP_POST_FILES(已弃用)。相同点:$FILES$HTTP_POST_FILES包含相同的...本特性可以使用户上传文本和二进制文件。用 PHP 的认证文件操作函数...
  • 一个等效的二进制文件,称为众所周知的二进制文件(WKB),用于在数据库(如PostGIS)上传输存储相同的信息。这些格式由开放地理空间联盟(OGC)管理,并在其简单特性访问协调转换服务规范中进行了描述。 几何对象 ...
  • res/rawassets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 res/rawassets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R....
  • pfilespfile有什么不同?...一、从者的文件内容上区别为:spfile是二进制文件,pfile是文本文件;且spfile比pfile用起来更灵活。 二、相同点:二者均为Oracle数据库参数文件,主要运用于存储系统的...
  • Linux下shell命令的使用

    2020-03-27 13:22:14
    一、diff命令 diff 命令能比较单个文件或者...列出不同的二进制文件、公共子目录只在一个目录出现的文件。 必须牢记一点,diff描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配, shell...
  • 以哈夫曼编码本1为参照,将文本文件source.txt的内容转换为二进制码文件code.dat 以哈夫曼编码本1为参照,将二进制码文件code1.dat的内容解码为target.txt明文 编写函数,对比source.txt target.txt是否相同,...
  • nib:NeXT Interface Builder的缩写 xib:XML nib的缩写 相同点:  nibxib都是Interface Builder的图形界面设计文档。Interface Builder把窗口、菜单... nib为二进制文件,xib为纯文本文件,采用xml格式,后...
  • clog、blob、bfile、long

    2015-06-09 09:28:48
    相同点 都是二进制 不能作为order by 或group by,不能在数据库链中使用,不能进行比较 不同点 bfile 保存的是操作系统的文件,数据库中只是保存的是文件指针 long 一个表只能定义一个这种类型的字段 最大2g ...
  • 文件的输入/输出,mode 的类型有 读模式(r),写模式(w),追加模式(a),没有就创建模式(x),t 表示文本文件,b表示的是二进制文件,xt 模式表示 如果不存在就创建一个新的,但是如果存在就报错 fout = open(filename,mode)...
  • 易语言 茶凉专用模块

    2010-05-04 12:26:36
    子程序 到任意进制, 文本型, 公开, 可以将从二进制到三十六进制的数值随意进行转换(返回转换后的文本) .参数 被转换文本, 文本型, , 欲被转换的文本(不可以转换负数以及小数) .参数 被转换进制, 整数型, , 被转换...
  • 5.10 对二进制文件做内存映射 155 5.11 处理路径名 157 5.12 检测文件是否存在 158 5.13 获取目录内容的列表 159 5.14 绕过文件名编码 161 5.15 打印无法解码的文件名 162 5.16 为已经打开的文件添加或修改编码方式 ...
  • python cookbook(第3版)

    2016-01-06 22:24:38
    5.10 内存映射的二进制文件 5.11 文件路径名的操作 5.12 测试文件是否存在 5.13 获取文件夹中的文件列表 5.14 忽略文件名编码 5.15 打印不合法的文件名 5.16 增加或改变已打开文件的编码 5.17 将字节写入...
  • WINRAR5.0正式注册版

    2013-10-10 10:14:03
    它提升了可压缩效果差数据的大文件和使用BLAKE2校验和时的解压速度。 3. RAR 5.0 压缩文件格式的改变: a) 文件时间存储为协调世界时(UTC),替代以前的本地时间,这让文件在不同的时区内 的交流更直观; b) ...
  • BIN:二进制文件 BINHex:苹果的一种编码格式 BMP:Windows或OS/2位图文件 BOOK:Adobe FrameMaker Book文件 BOX:Lotus Notes的邮箱文件 BPL:Borlard Delph 4打包库 BSP:Quake图形文件 BUN:CakeWalk 声音...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

二进制文件和文本文件相同点