二進制和ASCII文件的區別
覺得有用的話,歡迎一起討論相互學習~
版權聲明:本文為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'。





