二進制和ASCII文件的區別


二進制和ASCII文件的區別

覺得有用的話,歡迎一起討論相互學習~

我的微博我的github我的B站

版權聲明:本文為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'。


免責聲明!

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



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