計算機概論:C/C++程式設計
|
第7章 檔案輸入/輸出 |
|
|
授課教師:陳慶瀚 WWW : http://www.miat.ee.isu.edu.tw/cpp E-mail : pierre@isu.edu.tw |
|
7.3 讀寫資料檔 一旦宣告了一個檔案串流物件,從資料檔讀取或寫入是一件非常簡單的事,只要使用"<<" 和">>"運算子就可以了。就像在console mode底下做I/O一樣,在console mode, 我們使用cin將資料串流由鍵盤讀入,使用cout將資料串流輸出至螢幕。同樣的,我們使用ifstream的物件去讀取檔案中的資料串流(stream),使用ofstream的物件將資料串流(stream)寫入檔案中。範例程式7-3和範例程式7-4分別展示把資料寫入檔案以及從檔案讀取資料的簡單範例。 /*----------------------------------------------------*/ // 範例程式7-3 // 把資料寫入檔案 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include <fstream.h> void main() { //宣告一個預備寫入資料的ofstream檔案物件,並開啟檔名為ex7-3.txt的檔案 //如果ex7-3.txt不存在,則新建;如果已經存在,則將其內容刪除 ofstream
out("ex.txt"); out <<10<<"\t"<<19.95
<< endl; //寫入整數、tab鍵、浮點數、換行鍵 out <<20<<"\t"<<36.7<<
endl; //寫入另一行 out.close(); // 關閉檔案 } 執行這個程式,你可以到你的檔案夾目錄(與你的程式碼檔案相同的目錄)裡看看,是否已多出一個檔案ex7-3.txt。因為這是一個ASCII文字檔,所以你可以用任何文字編輯器(如Windows所附的記事本)或者C++編譯器的程式碼編輯器都可以將其打開。你看到的內容應該如下: 10 19.95 20 36.7 就像所有的文字檔一樣,你可以任意編修其內容。例如你可以試著將36.7改成45.6後重新存檔。在下一個範例程式,我們將從這個檔案讀取資料。 /*----------------------------------------------------*/ // 範例程式7-4 // 由檔案讀取資料 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include <fstream.h> void main() { //宣告一個預備讀取資料的ifstream檔案物件,並開啟檔名為ex7-3.txt的檔案 ifstream
in("ex.txt"); if(!in) //如果檔案不存在
{
return; //離開main()函式,即結束程式
} int x; float y; for(int i=0;i<2;i++) { // 依ex7-3.txt資料排序讀入整數和浮點數,資料檔中的tab和換行控制字元會自動忽略 in>>x>>y; cout<<x<<"\t"<<y<<endl;
//輸出x和y
} in.close(); } 範例程式7-5是另一個有關檔案I/O的例子。這個程式是讀取由鍵盤輸入的一連串字元,讀取每一個字元後,使用cout將字元輸出至螢幕,同時寫入磁碟中的檔案。當使用者輸入一 exclamation point時這程式便停止.要使用這個程式時, 要指定輸出檔案的名稱到指令行裡. /*----------------------------------------------------*/ // 範例程式7-5 // 讀取鍵盤輸字元,再寫入檔案 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include <fstream.h> void main() {
ofstream out("ex7-5.txt");
char str;
cout<<"輸入任意字元,若為z則程式結束 :\n";
while(1) // 使用無窮迴圈
{
cin >> str; //讀取由鍵盤輸入的一個字元,放入str
if(str=='z')break; //如果str=='z',則中斷while迴圈
cout<<str; //輸出到螢幕
out<<str; //輸出到檔案
}
}
out.close(); } 當使用>>運算子讀取文字檔案,或使用<<運算子將文字資料寫入檔案時,程式將會根據ASCII資源碼自動作字元轉換。例如讀檔時,檔案存取指標將會自動跳過空白字元(ASCII對應的十進位值是32)、Tab字元(ASCII對應的十進位值是9)和換行字元(ASCII對應的十進位值是10)。如果我們想把包含一些控制碼的字元資料寫入檔案,程式也會自動作字元轉換,例如把十進位值是10的字元轉為換行的控制碼。範例程式7-6展示一個這樣的例子。 /*----------------------------------------------------*/ // 範例程式7-6 // 自動字元轉換 // 陳慶瀚,2001 /*----------------------------------------------------*/ #include <fstream.h> void main() {
ofstream out("ex7-5.txt");
char a=97,b=102,c=10,d=116; //以十進制指定4個字元變數的初值
out<<int(a)<<int(b)<<int(c)<<int(d); //輸出字元變數的十進制值
out<<endl;
out<<a<<b<<c<<d; //輸出字元變數內容
out.close(); } 你將看到這個程式輸出的結果如下: 9710210116 af t 第一行輸出字元變數的十進制值(由於我們沒有加上空白鍵或tab鍵,所以所有數字都連在一起),第二行我們應該看到4個字元,但結果卻不是如此,因為第三個字元的十進制值是10,恰巧對應換行指令'\n'的字元碼,因此檔案物件把它轉換為換行指令,所以我們才在第4行看到一個字元。 使用ASCII文字檔來儲存資料是最簡便的檔案I/O方式,因為我們可以用任何文字編輯器來閱覽或編修,ASCII文字檔還有一個優點是我們可以對資料進行格式化及排版,格式化的資料檔案讀取和寫入都相對簡單,至於排版的資料檔則易於閱讀和維護。但是它也有缺點,首先它需要使用較多的儲存空間,例如一個4位元的浮點數3.14159轉為ASCII碼就需要7個bytes,再加上隨後的空白鍵就要8個bytes儲存空間。此外,我們也不希望所有的資料檔案再存檔時都作字元自動轉換,例如影像資料(其值通常界於0-255),就不適合以ASCII文字檔來儲存。最後,ASCII文字檔格式通常不是很有效率的資料檔案輸入/輸出的形式。在上述情況下,二進位形式的檔案存取是最好的選擇,我們下一節討論這一主題。 |
||
計算機概論:C/C++程式設計 義守大學電機系 陳慶瀚 |