二進制文件和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個字節為'\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文件什么樣
- #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”。
轉:http://blog.csdn.net/sxhelijian/article/details/29594687#comments