二進制文件和ASCII文件有何區別


二進制文件和ASCII文件(即文本文件)的區別,對於和計算機親近時間尚短的同學是個難題。

1、一個例子:兩種100000

  有程序:

[cpp] view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  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文件什么樣

[cpp] view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  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保存到二進制文件什么樣

[cpp] view plain copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM