計算機概論:C/C++程式設計

 

第7 檔案輸入/輸出

 

 


授課教師:陳慶瀚

WWW : http://www.miat.ee.isu.edu.tw/cpp

E-mail : pierre@isu.edu.tw   

 


7.4二進位檔案的輸入/輸出

要存取檔案的二元(binary)資料,首先必須指定開啟模式為ios::binary,一旦檔案開啟模式為binary,則所有的資料將以二進位形式存檔,就算是空白字元,tab字元,或是換行字元,都會以字元的二進位形式存檔,整數、浮點數就分別以其資料型別所佔的位元空間來儲存二進制資料,不管資料內容是什麼都不會作字元自動轉換。

 

put() get()

 

除了宣告檔案輸入/輸出物件開啟模式為ios::binary外,我們還需要一些專屬於檔案物件的函式來存取二進制資料(有時也稱為非格式化資料),兩個最基本的函式是不可或缺的:

put(char)

get(char)

這兩個函式提供以字元存取的方式來使用非格式化資料。其中get( )函式屬於ifstream的成員函式,功能是從二進制檔案中讀取一個字元;而put( )則屬於ofstream的成員函式,功能是將一字元寫入二進制檔案中。

下面的程式為顯示檔案內容(“ex2.txt”)到螢幕上,並且判斷是否包含文字或二進位資料. 它使用get( ) 函式.  

範例程式7-7使用put( )ASCII0255所對應的所有字元寫入檔案中。由於ASCII碼只使用一半作為可見的字元,另一半則是延伸字元集並且包含一些特殊符號和控制碼。

 

/*----------------------------------------------------*/

//                  範例程式7-7

//                 使用put( )函式

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <fstream.h>

void main()

{

   char c;

   ofstream out("ex2.txt", ios::binary); //宣告一個二進制的輸出檔案物件

   for(int i=0; i<256; i++)

   {

      c = (char) i; //將整數轉為字元

      out.put(c);   //使用out的成員函式將單一字元存入二進制的檔案中

   }

   out.close();

}

執行這個程式,隨後開啟ex2.txt,你應該看到類似下列的結果

......!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€????????????????﹜ㄓ它夾帚型陋秣捲陷絮溢劃遞蝨螃謝藥齪圴佮迓玿旂衲欶......

除了英數字之外,看起來還夾雜著很多的亂碼,這些都是ASCII碼中不可見字元或特殊符號。

 

/*----------------------------------------------------*/

//                  範例程式7-8

//                 使用get( )函式

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <fstream.h>

void main()

{

   char ch;

   ifstream in("ex2.txt", ios::binary); // 宣告一個二進制的輸入檔案物件

   while(in)

//如果檔案物件指標指向檔案底端,則in傳回0,迴圈中斷

   {

      in.get(ch);  //使用in的成員函式get()讀取一個字元

      cout << ch;

   }

}

 

read( ) write( )

 

如果我們想對大量的二進制資料進行存取,fstream提供另外兩個成員函式:

istream &read(char *buf, int num);

ostream &write(const char *buf, int num);  

ifstreamread( )函式從檔案一次讀取num 個字元,然後用把他們放入buf中;ofstreamwrite( )函式則是經由bufnum個字元一次寫入到檔案中。  

範例程式7-97-10展示如何使用read( )write( )

/*----------------------------------------------------*/

//                  範例程式7-9

//              使用write()一次寫入一個區塊資料

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <fstream.h>

void main()

{

    int buf [5] = {1, 2, 3, 4, 5};

    ofstream out("test", ios::binary);

    if(!out) //檔案開啟失敗

{

cout << "無法開啟檔案\n";

return;

    }

//bufint型別轉為char型別,再經由out的成員函式write()寫入檔案

    out.write((char *) &buf, sizeof(buf));

    out.close();

}

執行這個程式,buf所含的字元資料會非常有效率的被寫入binary檔案中,如果你用文字編輯器把ex3.txt打開來看,你可能會看到如下結果:

    

似乎與相像中的結果不大一樣,這是因為binary檔案不適合以ASCII文字編輯器來閱覽,如果你使用範例程式7-10將檔案以binary模式開啟,再將資料讀入,就可以確認資料內容與寫入時是完全一致的。

/*----------------------------------------------------*/

//                  範例程式7-10

//              使用read()將區塊資料一次讀取

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <fstream.h>

void main()

{

  int buf[5]={0,0,0,0,0};  //buf初值設為0

  ifstream in("test", ios::binary); //宣告檔案物件的開啟模式為binary

// 以區塊字元的格式讀取,再放入buf

  in.read((char *) & buf, sizeof buf);

  for(int i=0; i<5; i++) // buf陣列資料顯示在螢幕

  {

   cout << buf [i] << " ";

  }

  in.close();

}


 

計算機概論:C/C++程式設計

義守大學電機系 陳慶瀚 
2001.12.26

 

謝孟媛 dvd -
情趣用品 -
飛鳥遊戲 -
遊戲基地 -
PATEK PHILIPPE -
xyz資訊工作坊 -
xyz軟體王 -
英文老師 -
沛納海 -
xyz軟體下載倉庫 -
基測試題 -
CARTIER 卡地亞 -
林晟數學 -
PIAGET -
費洛蒙情定 -
xyz -
軟體大補帖 -
高國華補習班 -
game淘 -
ps2台片 -
wii超級瑪莉攻略 -
情定費洛蒙 -
wii價格2011 -
xbox 360台片 -
tvgame360 -
愛馬仕 -
春藥專賣店 -
ps3價錢 2011 -
ps2遊戲王 -
wii遊戲片專賣店 -
百達翡麗 PATEK PHILIPPE -
壯陽藥品哪買 -
海賊王 -
春藥王 -
xyz軟體下載倉庫 -
壯陽食物 -
xbox360 -
催情藥 -
TISSOT 天梭 -
ps2遊戲燒錄 -
威而剛哪裡買 -
一夜情婦 -
xbox 360台片專賣 -
國中基測題庫 -
無雙遊戲網 -
xyz軟體王 -
ps2遊戲片80元 -
基測 -
xyz軟體王下載 -
GUCCI 古馳 -
南一題庫網 -
COACH -
LOUIS VUITTON -
wii超級瑪莉 -
wii價格2011 -
魔法老師 -
催情藥專賣店 -
國小翰林題庫網 -
wii遊戲片專賣店 -
遊戲天堂 -
寶格麗 -
金榜之路 -
wii遊戲片80元 -
xbox 360遊戲片 -
wii遊戲載點 -
人類費洛蒙情定 -
xbox 360台片專賣 -
催情王 -
xyz軟體之家 -
ps2遊戲片80元 -
情色小站 -
微風廣場 -
情慾之夜 -
民視文化 -
xbox360 -
蔻馳 -
ps2遊戲燒錄 -
ps3遊戲片 -
龍騰高中題庫 -
ps3台片 -
威而剛 -
ps3價錢 2011 -
軟體王下載 -
蕭邦 CHOPARD -
龍騰 -
催情藥 -
威而剛哪裡買 -
基測題目 -
HERMES 愛馬仕 -
情定費洛蒙 -
ps2台片 -
ps3遊戲片 -
wii瑪莉兄弟遊戲 -
江詩丹頓 Vacheron Constantin -
wii超級瑪莉 -
wii遊戲片在ho99小舖 -
春藥王 -
歷屆基測試題 -
窮人軟體 -
威而柔哪裡買 -
蕭邦 -
翰林題庫網 -
一夜情婦 -
wii遊戲下載 -
xbox 360遊戲 -
壯陽食物 -
ps2遊戲片 -
sogo百貨 -
台灣情色網 -
xyz軟體王下載 -
lv2011官方網 -
wii遊戲片專賣店 -
xbox 360價錢 -
歐米茄 -
雷達錶 RADO -
xyz資訊工坊 -
儒林補習班 -
壯陽藥品 -
xyz軟體王 -
窮人遊戲 -
ps2遊戲下載 -
ps3台片 -
德周 -
sogo百貨 -
費洛蒙情定 -
壯陽藥品哪買 -
催情王 -
春藥哪裡買 -
lv2011夏季新款 -
情趣用品 -
中友百貨 -
史萊姆的第一個家 -
情色論壇 -
萬寶龍 MONT BLANC -
萬國 -
ps2遊戲下載 -
春藥哪裡買 -
xyz資訊工作坊 -
龍騰文化 -
太平洋百貨 -
軟體王 -
xbox 360台片專賣 -
ps3遊戲片在ho99小舖 -
壯陽藥 -
xyz軟體銀行 -
xbox360台片 -
魔法24 -
wii遊戲片80元 -
XYZ資訊工坊 -
CARTIER -
春藥網 -
壯陽 -
xyz 軟體補給站 -
微風廣場 -
lv2011新款型錄 -
xbox 360遊戲 -
費洛蒙 -
卡地亞 -
wii遊戲下載 -
窮人天碟 -
春藥專賣店 -
gucci2011專賣店旗艦店 -
迪奧 -
CHANEL -
xyz軟體大本營 -
xbox 360遊戲片在ho99小舖 -
台北郵購網 -
BURBERRY 巴寶莉 -
伯爵 -
遠東百貨 -
陳希 -
費洛蒙mx -
時間廣場 -
漢神百貨 -
情色論壇 -
傳政 -
軟體 -
寶格麗 BVLGARI -
名牌包俱樂部 -
時間廣場 -
威而柔 -
wii瑪莉兄弟遊戲 -
lv名牌包專賣店 -
xyz軟體大本營 -
威而柔哪裡買 -
伯爵 PIAGET -
xyz軟體銀行 -
ps3遊戲下載 -
wii超級瑪莉歐 -
無名套裝 -
xyz軟體下載倉庫 -
江詩丹頓 -
林晟 -
ps3遊戲片在ho99小舖 -
威而剛 -
費洛蒙mx -
xyz軟體之家 -
HERMES -
林晟超理解數學 -
謝孟媛 -