這裡講一下如何打開和關閉磁盤上的文件,其他外設(U盤、光盤等)上的文件與此相同。
打開文件
所謂打開(open)文件是一種形象的說法,如同打開房門就可以進入房間活動一樣。 打開文件是指在文件讀寫之前做必要的准備工作,包括:
-
為文件流對象和指定的磁盤文件建立關聯,以便使文件流流向指定的磁盤文件。
-
指定文件的工作方式,如,該文件是作為輸入文件還是輸出文件,是ASCII文件還是二進制文件等。
以上工作可以通過兩種不同的方法實現。
1) 調用文件流的成員函數open。如
ofstream outfile; //定義ofstream類(輸出文件流類)對象outfile
outfile.open("f1.dat",ios::out); //使文件流與f1.dat文件建立關聯
第2行是調用輸出文件流的成員函數open打開磁盤文件f1.dat,並指定它為輸出文件, 文件流對象outfile將向磁盤文件f1.dat輸出數據。ios::out是I/O模式的一種,表示以輸出方式打開一個文件。或者簡單地說,此時f1.dat是一個輸出文件,接收從內存輸出的數據。
調用成員函數open的一般形式為:
文件流對象.open(磁盤文件名, 輸入輸出方式);
磁盤文件名可以包括路徑,如"c:\new\\f1.dat",如缺省路徑,則默認為當前目錄下的文件。
2) 在定義文件流對象時指定參數
在聲明文件流類時定義了帶參數的構造函數,其中包含了打開磁盤文件的功能。因此,可以在定義文件流對象時指定參數,調用文件流類的構造函數來實現打開文件的功能。如
ostream outfile("f1.dat",ios::out);
一般多用此形式,比較方便。作用與open函數相同。
輸入輸出方式是在ios類中定義的,它們是枚舉常量,有多種選擇,見表13.6。
表13.6 文件輸入輸出方式設置值
方 式 |
作用 |
ios::in
以輸入方式打開文件
ios::out
以輸出方式打開文件(這是默認方式),如果已有此名字的文件,則將其原有內容全部清除
ios::app
以輸出方式打開文件,寫入的數據添加在文件末尾
ios::ate
打開一個已有的文件,文件指針指向文件末尾
ios: :trunc
打開一個文件,如果文件已存在,則刪除其中全部數據,如文件不存在,則建立新文件。如已指定了 ios::out 方式,而未指定ios: :app,ios::ate,ios: :in,則同時默認此方式
ios:: binary
以二進制方式打開一個文件,如不指定此方式則默認為ASCII方式
ios::nocreate
打開一個已有的文件,如文件不存在,則打開失敗。nocrcate的意思是不建立新文件
ios:: noreplace
如果文件不存在則建立新文件,如果文件已存在則操作失敗,replace 的意思是不更新原有文件
ios::in l ios::out
以輸入和輸出方式打開文件,文件可讀可寫
ios:: out | ios::binary
以二進制方式打開一個輸出文件
ios::in l ios::binar
以二進制方式打開一個輸入文件
幾點說明:
1) 新版本的I/O類庫中不提供ios::nocreate和ios::noreplace。
2) 每一個打開的文件都有一個文件指針,該指針的初始位置由I/O方式指定,每次讀寫都從文件指針的當前位置開始。每讀入一個字節,指針就後移一個字節。當文件指針移到最後,就會遇到文件結束EOF(文件結束符也占一個字節,其值為-1),此時流對象的成員函數eof的值為非0值(一般設為1),表示文件結束了。
3) 可以用“位或”運算符“|”對輸入輸出方式進行組合,如表13.6中最後3行所示那樣。還可以舉出下面一些例子:
ios::in | ios:: noreplace //打開一個輸入文件,若文件不存在則返回打開失敗的信息
ios::app | ios::nocreate //打開一個輸出文件,在文件尾接著寫數據,若文件不存在,則返回打開失敗的信息
ios::out l ios::noreplace //打開一個新文件作為輸出文件,如果文件已存在則返回打開失敗的信息
ios::in l ios::out I ios::binary //打開一個二進制文件,可讀可寫
但不能組合互相排斥的方式,如 ios::nocreate l ios::noreplace。
4) 如果打開操作失敗,open函數的返回值為0(假),如果是用調用構造函數的方式打開文件的,則流對象的值為0。可以據此測試打開是否成功。如
if(outfile.open("f1.bat", ios::app) ==0)
cout <<"open error";
或
if( !outfile.open("f1.bat", ios::app) )
cout <<"open error";
關閉磁盤文件
在對已打開的磁盤文件的讀寫操作完成後,應關閉該文件。關閉文件用成員函數close。如
outfile.close( ); //將輸出文件流所關聯的磁盤文件關閉
所謂關閉,實際上是解除該磁盤文件與文件流的關聯,原來設置的工作方式也失效,這樣,就不能再通過文件流對該文件進行輸入或輸出。此時可以將文件流與其他磁盤文件建立關聯,通過文件流對新的文件進行輸入或輸出。如
outfile.open("f2.dat",ios::app|ios::nocreate);
此時文件流outfile與f2.dat建立關聯,並指定了f2.dat的工作方式。