zoukankan      html  css  js  c++  java
  • 二进制文件和ASCII文件有何差别

    二进制文件和ASCII文件(即文本文件)的差别,对于和计算机亲近时间尚短的同学是个难题。本文用简单的样例,试图展示当中的道道,希望能对菜鸟们有些帮助。

    1、一个样例:两种100000

      有程序:
    #include<iostream>
    using namespace std;
    int main( )
    {
       char c[8]="100000";
       int n=100000;
       cout<<"c="<<c<<endl;
       cout<<"n="<<n<<endl;
       return 0;
    }
      执行结果:
      c=100000
      n=100000

      c和n的输出看起来是一样的,那两者真的一样吗?

      显然不是一回事。
      有图为证。以下是在CodeBlock中单步执行上面的程序时,跟踪c和n的值看到的情形。
      
      (注:要将待观察的数据以二进制形式显示出来,方法见本文附注部分。)
      
      字符串的c占用了8个字节,保存的是:1个'1'(ASCII码为49,二进制110001)、5个'0'(ASCII码为48,二进制110000),最后2个字节为''(ASCII码为0)
      而整型的n,用4个字节(能够将图中二进制1 1000 0110 1010 0000转成十进制,正好100000。本来4字节32位,前面的0省略了。)
      重点品味一下n。n在内存中用4字节表示,那样一种形式,对掌握计算机内部机制的人不是回事,但对和计算机尚做不到十分亲近的人而言,32位的数据就是#@!#!@#...。当程序中用cout<<n的方式显示n值时,给出的是100000。可敬的cout!
      实际上,cout输出过程中,计算机已经给我们做了转换:将n的二进制内部表示,转换成了人乐于看到的字符形式。
      

    2、将n保存到ASCII文件什么样

    #include<fstream>
    using namespace std;
    int main( )
    {
        int n=100000;
        ofstream out("a.dat",ios::out);
        out<<n<<endl;
        return 0;
    }
      执行这一段程序,是将n输出到ASCII文件a.dat中。
      文件能够用记事本打开,如图:
      
      显然,ASCII文件里表示n时,也是“看起来”的样子,而不是n在内存里的实际表示形式
      

    3、将n保存到二进制文件什么样

    #include<fstream>
    using namespace std;
    int main( )
    {
        int n=100000;
        ofstream out("b.dat",ios::out|ios::binary);
        out.write((char*)&n, sizeof(n));
        return 0;
    }
      执行这一段程序,是用对二进制文件写入的方式,将n输出到文件b.dat中。
      用记事本打开b.dat文件,如图:
      
      纳尼?这是个神马字?你会念吗?开什么玩笑!
      找一个查看二进制文件的软件(我用BinaryViewer),看到的b.txt例如以下:
      
      文件为4字节大。按高位优先的原则(将图中显示的4个字节由后往前取出来),里面保存的数的十六进制形式是:0x000186A0,展开成二进制形式,自然是1 1000 0110 1010 0000,这恰是十进制数100000在内存中的形式。至于为何显示的是那么一个怪字,须要了解汉字编码的知识,參见《 用C++程序理解汉字的机内码表示》(跳转之前,先将本文读完)。
      
      用BinaryViewer也看一下a.txt——前文中还有一个也是保存100000的文件,仅仅只是,是ASCII文件。查看结果是:
      
      文件共同拥有8字节,前面的6个字节,保存的是:1个'1'(ASCII码为49,十六进制31)、5个'0'(ASCII码为48,十六进制30)。
      
      由此能够看出二进制文件和ASCII文件的差别:前者,用和内存中一样的方式保存数据;而后者,用和cout显示一样的方式保存,存的是人“看起来”的那个样子。
      不方便人看的二进制文件实际上效率更高,用途更广,初学编程的童鞋,不要错过学会它的机会。

      
      

    附注:用以下的方法将待观察的数据以二进制形式显示出来

      在待观察的变量上击鼠标右键,选“Properties”,例如以下图
      
      在“Format”部分,例如以下图选择“Binary”后,点击“OK”。
      



    ================= 迂者 贺利坚 CSDN博客专栏=================
    |== IT学子成长指导专栏 专栏文章的分类文件夹(不定期更新) ==|
    |== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
    |== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
    ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====




  • 相关阅读:
    忽然背后冒冷汗
    随机获取中国境内ip地址的php代码
    复制粘贴的句子
    Winform使用BackGroundWorker代替线程执行后台代码
    在IE中测试调用Web Service
    在存储过程中编写正确的事务处理代码
    【转】使用HttpWebRequest POST图片等文件,带参数
    LINQ to Entities 不识别方法"System.String ToString()"
    Asp.net 出现:HTTP 错误 404.0 Not Found
    C# 用内存映射文件读取大日志文件(.log)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3790600.html
Copyright © 2011-2022 走看看