天天看點

從零開始學C++之IO流類庫(二):檔案流(fstream, ifstream, ofstream)的打開關閉、流狀态

一、檔案流

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程序不能再對檔案進行讀寫。

(三)、檔案打開模式的有效組合

從零開始學C++之IO流類庫(二):檔案流(fstream, ifstream, ofstream)的打開關閉、流狀态

上述所有的打開模式組合還可以添加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模式,檔案同樣會被清空

三、流狀态

從零開始學C++之IO流類庫(二):檔案流(fstream, ifstream, ofstream)的打開關閉、流狀态

對應于這個标志字各狀态位,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++程式設計規範