二进制和ASCII文件的区别

原文链接: https://blog.csdn.net/sxhelijian/article/details/29594687

二进制和ASCII文件的区别

觉得有用的话,欢迎一起讨论相互学习~Follow Me

版权声明:本文为CSDN博主「迂者-贺利坚」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sxhelijian/article/details/29594687

Example

#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默认是使用ASCII码进行表示的,即每一位都对应其二进制表示的ASCII码,而n直接使用二进制表示即将这个整数转换成二进制表示数
有图为证。下面是在CodeBlock中单步执行上面的程序时,跟踪c和n的值看到的情形。

字符串的c占用了8个字节,保存的是:1个’1’(ASCII码为49,二进制110001)、5个’0’(ASCII码为48,二进制110000),最后2个字节为’\0’(ASCII码为0)
而整型的n,用4个字节(可以将图中二进制1 1000 0110 1010 0000转成十进制,正好100000。本来4字节32位,前面的0省略了)

将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中

将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文件,如图:
    将其视为二进制文件进行查看,使用Binary Viewer,看到的b.txt如下:

    文件为4字节大。按高位优先的原则(将图中显示的4个字节由后往前取出来),里面保存的数的十六进制形式是:0x000186A0,展开成二进制形式,自然是1 1000 0110 1010 0000,这恰是十进制数100000在内存中的形式。
    用BinaryViewer也看一下a.txt——前文中另一个也是保存100000的文件,只不过,是ASCII文件。查看结果是:

    文件共有8个字节,前面的6个字节,保存的是:1个’1’(ASCII码为49,十六进制为31),5个’0’(ASCII码为48,十六进制为30)
    由此可以看出二进制文件和ASCII文件的区别:前者,用和内存中一样的方式保存数据;而后者,用和cout显示一样的方式保存,存的是人“看起来”的那个样子。
     不方便人看的二进制文件实际上效率更高,用途更广,初学编程的童鞋,不要错过学会它的机会。

附注:将数据使用二进制形式显示出来的方法

在待观察的变量上击鼠标右键,选“Properties”,如下图

在’Format’部分,如下图选择’Binary’后,点击’OK’。

猜你喜欢

转载自blog.csdn.net/u013555719/article/details/102546974