标签:style class blog code http tar
二进制文件和ASCII文件(即文本文件)的差别,对于和计算机亲近时间尚短的同学是个难题。本文用简单的样例,试图展示当中的道道,希望能对菜鸟们有些帮助。
#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和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。n在内存中用4字节表示,那样一种形式,对掌握计算机内部机制的人不是回事,但对和计算机尚做不到十分亲近的人而言,32位的数据就是#@!#!@#...。当程序中用cout<<n的方式显示n值时,给出的是100000。可敬的cout!
实际上,cout输出过程中,计算机已经给我们做了转换:将n的二进制内部表示,转换成了人乐于看到的字符形式。
#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中。
#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中。
================= 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章的分类文件夹(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| |== 我写的书——《逆袭大学——传给IT学子的正能量》 ==| ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ===== |
二进制文件和ASCII文件有何差别,布布扣,bubuko.com
标签:style class blog code http tar
原文地址:http://www.cnblogs.com/mengfanrong/p/3790600.html