C++文件操作:打開文件和寫入文件
如果程序的運行結果僅僅顯示在屏幕上,當要再次查看結果時,必須將程序重新運行一遍;而且,這個結果也不能被保留。
如果希望程序的運行結果能夠永久保留下來,供隨時查閱或取用,則需要將其保存在文件中。
文件分類
外部文件和內部文件
- 外部文件:指磁盤文件,也是通常所謂的文件。
- 內部文件:指在程序中運行的文件,更正式的稱謂是“文件流對象”。
- 程序中操作的是內部文件,最後保存的是外部文件。
文本文件和二進制文件
- 文本文件:由字符序列組成,以字符(character) 為存取最小信息單位,也稱“ASCII碼文件”。
- 二進制文件:由二進制數組成。
使用過程
本節只討論文本文件的使用方法和操作過程及其簡單應用。
使用文本文件的過程是固定的,一般步驟如下:
(1) 打開一個文件,使磁盤文件和文件流對象建立聯系;
(2) 將數據按文本方式寫入一個文件,就如同cout用於向顯示器送數據。以後可從這個文件讀取數據,就如同cin用於鍵盤輸入。
(3) 當不再使用文件時,要關閉文件,此時文件將從緩沖區中完全寫回磁盤。這樣,可以永久保存數據。
操作步驟
1.說明一個文件流對象(內部文件)。
例如: ifstream ifile; //說明輸入文件流對象ifile
ofstream ofile; //說明輸出文件流對象ofile
說明:
- 文件流類型ifstream支持從輸入文件中提取數據的操作。
- 文件流類型ofstream完成數據寫入輸出文件中的各種操作。
- ifile是輸入文件流對象,用於讀;ofile是輸出文件流對象,用於寫。
2.打開文件,在文件流對象和磁盤文件之間建立聯系。
例如: ifile.open( "d:\\my_in_file.txt" );
ofile.open( "d:\\my_out_file.txt" );
說明:
- 雙引號中的字符串(如"d:\\my_in_file.txt" )為磁盤文件路徑名。
- 通過輸入文件流對象(如ifile)或輸出文件流對象(如ofile)打開指定磁盤文件,將在文件流對象和磁盤文件之間建立聯系。
- 輸入/輸出文件流對象都被稱為“內部文件”,即和對應磁盤文件聯系的“虛文件”。
3.對文件進行讀寫操作。
- 文件讀寫在文件緩沖區中進行。
- 最常見的文件讀寫是順序的,即從文件頭開始進行。
- 順序讀寫可用C++的提取運算符(>>)和插入運算符(<<)進行;也可以用讀字符的get()和讀字符串的getline()等函數進行。
4.關閉文件。
文件操作結束後,應該顯式地關閉該文件,與打開文件相對應,例如:
ifile.close();
ofile.close();
關閉文件時,系統把與該文件相關聯的文件緩沖區中的數據寫到磁盤文件中,保證文件的完整;同時把磁盤文件名與文件流對象之間的關聯斷開,可防止誤操作修改了磁盤文件。
應用舉例
【例2.25】將百雞問題計算結果存入文件。
1 #include<fstream> 2 #include<iomanip> 3 using namespace std; 4 int main(){ 5 int i,j,k; 6 ofstream ofile; //定義輸出文件 7 ofile.open("d:\\myfile.txt"); //作為輸出文件打開 8 ofile<<" 公雞 母雞 小雞"<<endl; //標題寫入文件 9 for(i=0;i<=20;i++) 10 for(j=0;j<=33;j++){ 11 k=100-i-j; 12 if((5*i+3*j+k/3==100)&&(k%3==0)) //註意(k%3==0)非常重要 13 ofile<<setw(6)<<i<<setw(10)<<j<<setw(10)<<k<<endl; //數據寫入文件 14 } 15 ofile.close(); //關閉文件 16 return 0; 17 }
【例2.26】讀出存放百雞問題計算結果的文件
1 #include<fstream> 2 #include<iostream> 3 #include<iomanip> 4 using namespace std; 5 int main(){ 6 char a[28]; 7 ifstream ifile; //定義輸入文件 8 ifile.open("d:\\myfile.txt"); //作為輸入文件打開 9 int i=0,j,k; 10 while(ifile.get(a[i])){ //讀標題,請對比cin.get(),不可用>>,它不能讀白字符 11 if(a[i]==‘\n‘) break; 12 i++; 13 } 14 a[i]=‘\0‘; 15 cout<<a<<endl; 16 while(1){ 17 ifile>>i>>j>>k; //由文件讀入數據 18 if(ifile.eof()!=0) break; //當讀到文件結束時,ifile.eof()為真 19 cout<<setw(6)<<i<<setw(10)<<j<<setw(10)<<k<<endl; //屏幕顯示 20 } 21 ifile.close(); //關閉文件 22 return 0; 23 }
重要提示
- 操作步驟的第1、2步可以合並為1步,即說明文件流對象的同時打開對應的磁盤文件。例如:
ifstream ifile( "d:\\my_in_file.txt" ); //說明輸入文件流對象ifile並打開文件
ofstream ofile( "d:\\my_out_file.txt" );//說明輸出文件流對象ofile並打開文件
- 打開文件時,如磁盤文件不存在,會自動建立文件,但指定目錄必須存在,否則建立文件失敗。
- 計算機將外部設備也作為文件進行管理。例如:鍵盤和顯示器是標準的輸入輸出文件,其文件名分別為cin和cout。
- 磁盤文件操作與鍵盤、顯示器操作非常相似。例題中用輸出文件流對象(如ofile)代替cout,輸入文件流對象(如ifile)代替cin,數據的去向和來源則由顯示器和鍵盤變為磁盤文件。
- 對文件進行操作,必須在程序前增加一句: #include<fstream>
C++文件操作:打開文件和寫入文件