二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题。

1、一个例子:两种100000

  有程序:

  1. #include<iostream>
  2. using namespace std;
  3. int main( )
  4. {
  5. char c[8]="100000";
  6. int n=100000;
  7. cout<<"c="<<c<<endl;
  8. cout<<"n="<<n<<endl;
  9. return 0;
  10. }

  运行结果:
  c=100000
  n=100000

  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的二进制内部表示,转换成了人乐于看到的字符形式。
  

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

  1. #include<fstream>
  2. using namespace std;
  3. int main( )
  4. {
  5. int n=100000;
  6. ofstream out("a.dat",ios::out);
  7. out<<n<<endl;
  8. return 0;
  9. }

  运行这一段程序,是将n输出到ASCII文件a.dat中。
  文件可以用记事本打开,如图:
  
  显然,ASCII文件中表示n时,也是“看起来”的样子,而不是n在内存里的实际表示形式
  

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

  1. #include<fstream>
  2. using namespace std;
  3. int main( )
  4. {
  5. int n=100000;
  6. ofstream out("b.dat",ios::out|ios::binary);
  7. out.write((char*)&n, sizeof(n));
  8. return 0;
  9. }

  运行这一段程序,是用对二进制文件写入的方式,将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”。
  

转:http://blog.csdn.net/sxhelijian/article/details/29594687#comments

二进制文件和ASCII文件有何区别的更多相关文章

  1. 二进制文件和ASCII文件有何差别

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

  2. 二进制和ASCII文件的区别

    二进制和ASCII文件的区别 觉得有用的话,欢迎一起讨论相互学习~Follow Me 版权声明:本文为CSDN博主「迂者-贺利坚」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出 ...

  3. 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件)

    文本文件是可以看到的字符, 二进制文件是不可视字符,如图片. 二进制文件: 包含在 ASCII及扩展 ASCII 字符中编写的数据或程序指令的文件.计算机文件基本上分为二种:二进制文件和 ASCII( ...

  4. 利用PHP取二进制文件头判断文件类型

    <?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 779 ...

  5. C++学习48 对ASCII文件的读写操作

    如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...

  6. Latex中cls和sty文件有何区别?

    Latex中cls和sty文件有何区别? 资源 本文对 LaTeX 中 .cls 和 .sty 文件进行介绍,主要参考了 What are .cls and .sty files?How are th ...

  7. eclipse导出带有图片、音效、其他二进制文件的jar文件的经历

    先说下简单流程吧: 1.选中“项目”,右键->export->java的“jar file”->勾选“export generated clas files and resource ...

  8. ASCII 文件编码格式

    文件编码格式 阶段一:ASCII 阶段二:ANSI(本地化) 如:GBK.GB2312 阶段三:UNICODE(国际化) 如:UTF-8 ASCII(American Standard Code fo ...

  9. 利用arcigs制作出 源解析要用的ASCII文件

    准备:1.确定好模拟区域范围,精度,行列数          2.确定好源解析的城市规划 思路: 1.全国省级图+本地市县图-->合成一张区域图(联合) 合成之后,添加一个字段,一个数字类型字段 ...

随机推荐

  1. maven项目使用SOLR时报 previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest" 错的解决方法

    环境:Apache solr4.8,maven3,IntellijIDEA 想在项目中使用solr 在pom.xml文件中添加了solr的依赖 solr-core,solrj 和solr-dataim ...

  2. Microsoft Web Application Stress Tool 使用

    为了测试数据的准备性,首先需要删除缓存和Cookies等临时文件.启动IE后打开“工具”菜单下的“Internet”选项命令,在打开的“Internet选项”窗口的“常规”选项卡中,单击“Intern ...

  3. 【BZOJ1879】[Sdoi2009]Bill的挑战 状压DP

    [BZOJ1879][Sdoi2009]Bill的挑战 Description Input 本题包含多组数据.  第一行:一个整数T,表示数据的个数.  对于每组数据:  第一行:两个整数,N和K(含 ...

  4. Unity3D之Unity3D 4.3.0 破解方法

    Dear  All 破解有风险,破解不尊重知识产权,如果有涉及请删除或者联系我……以下呢 是我这几天捣鼓的4.3.0版本 供学习!请大家支持正版! 1.下载最新版本 我是在Unity官网下载的最新版本 ...

  5. oracle数据库实例状态

    1.已启动/不装载(NOMOUNT).启动实例,但不装载数据库. 该模式用于重新创建控制文件,对控制文件进行恢复或重新创建数据库.2.已装载(MOUNT).装载数据库,但不打开数据库. 该模式用于更改 ...

  6. BFS+优先队列+状态压缩DP+TSP

    http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  7. linux查看日志文件内容命令tail、cat、tac、head、echo、vi

    linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...

  8. 重新来认识你的老朋友Spring框架

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  9. 焦作网络赛E-JiuYuanWantstoEat【树链剖分】【线段树】

    You ye Jiu yuan is the daughter of the Great GOD Emancipator. And when she becomes an adult, she wil ...

  10. ubuntu16.04下安装opencv-3.1.0及其扩展模块opencv_contrib

    步骤1.安装依赖项 sudo apt--dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 可选的 sudo apt--dev l ...