一、檔案流
ofstream,由ostream派生而來,用于寫檔案
ifstream,由istream派生而來, 用于讀檔案
fstream,由iostream派生而來,用于讀寫檔案
二、打開檔案
說明了流對象之後,可使用函數open()打開檔案。檔案的打開即是在流與檔案之間建立一個連接配接
函數原型
void open(const char * filename, int mode = ios::out,int prot = _SH_DENYNO);
參數
filename:檔案的名稱,可以包含(絕對和相對)路徑
mode:檔案打開模式
prot:保護模式
(一)、檔案打開模式
打開方式 描述
ios::in 打開一個供讀取的檔案(ifstream流的預設值)
ios::out 打開一個供寫入的檔案(ofstream流的預設值)
ios::app 在寫之前找到檔案尾
ios::ate 打開檔案後立即将檔案定位在檔案尾
ios::trunc 廢棄目前檔案内容
ios::nocreate(已不再支援) 如果要打開的檔案并不存在,那麼以此參數調用open()函數将無法進行
ios::noreplace (已不再支援) 如果要打開的檔案已存在,試圖用open()函數打開時将傳回一個錯誤。
ios::binary 以二進制的形式打開一個檔案,預設為文本檔案
(二)、保護模式
#define _SH_DENYRW 0x10 /* deny read/write mode */拒絕對檔案進行讀寫
#define _SH_DENYWR 0x20 /* deny write mode */拒絕寫入檔案
#define _SH_DENYRD 0x30 /* deny read mode */拒絕檔案的讀取權限
#define _SH_DENYNO 0x40 /* deny none mode */讀取和寫入許可
#define _SH_SECURE 0x80 /* secure mode */共享讀取,獨占寫入
注意:假設A程序以_SH_DENYRW 打開,那麼是B程序不能再對檔案進行讀寫。
(三)、檔案打開模式的有效組合

上述所有的打開模式組合還可以添加ate模式。對這些模式添加ate模隻會改變檔案打開時的初始定位,在第一次讀或
寫之前,将檔案定位于檔案末尾處。
(四)、檔案打開的幾點說明
1、檔案打開也可以通過構造函數打開,例如:ofstream fout(“out.txt“,ios::out);
2、檔案的打開方式可以為上述的一個枚舉常量,也可以為多個枚舉常量構成的按位或表達式。
3、使用open成員函數打開一個檔案時,若由字元指針參數所指定的檔案不存在,則建立該檔案。(out)
4、當打開方式中不含有ios::ate或ios::app選項時,則檔案指針被自動移到檔案的開始位置,即位元組位址為0的位置。5、從效果上看ofstream指定out模式等同于指定了out和trunc模式
6、預設情況下,fstream對象以in和out模式同時打開。
7、當檔案同時以in和out打開時不會清空
8、如果隻使用out模式,而不指定in模式,則檔案會清空現有資料。
9、如果同時指定了out與app,不會清空
10、如果打開檔案時指定了trunc模式,則無論是否同時指定了in模式,檔案同樣會被清空
三、流狀态
對應于這個标志字各狀态位,ios類還提供了以下成員函數來檢測或設定流的狀态:
bool rdstate(); //傳回流的目前狀态标志字
bool eof(); //傳回非0值表示到達檔案尾
bool fail(); //傳回非0值表示操作失敗
bool bad(); //傳回非0值表示出現錯誤
bool good(); //傳回非0值表示流操作正常
bool clear(int flag=0); //将流的狀态設定為flag
為提高程式的可靠性,應在程式中檢測I/O流的操作是否正常。當檢測到流操作出現錯誤時,可以通過異常處理來解決問題。
四、檔案的關閉
每個檔案流類中都提供有一個關閉檔案的成員函數close()
功能:當打開的檔案操作結束後,就需要關閉它,使檔案流與對應的實體檔案斷開聯系,并能夠保證最後輸出到檔案緩沖區中的内容,無論是否已滿,都将立即寫入到對應的實體檔案中
函數原型:void close();
檔案流對應的檔案被關閉後,還可以利用該檔案流調用open成員函數打開其他的檔案,最好先clear 一下。
參考:
C++ primer 第四版
Effective C++ 3rd
C++程式設計規範