天天看點

檔案模式

在打開檔案時,無論是調用 open 還是以檔案名作為流初始化的一部分,都需指定檔案模式(file mode)。每個 fstream 類都定義了一組表示不同模式的值, 用于指定流打開的不同模式。檔案模式是整型常量,在打開指定檔案時,可用位操作符設定一個或多個模式。檔案流構造函數和 open 函數都提供了預設實參設定檔案模式。預設值因流類型的不同而不同。此外,還可以顯式地以模式打開檔案。

in

打開檔案做讀操作

out

打開檔案做寫操作

app

在每次寫之前找到檔案尾

ate

打開檔案後立即将檔案定位在檔案尾

trunc

打開檔案時清空已存在的檔案流

binary

以二進制模式進行 IO 操作

out、trunc 和 app 模式隻能用于指定與 ofstream 或 fstream 對象關聯的檔案;in 模式隻能用于指定與 ifstream 或 fstream 對象關聯的檔案。所有的檔案都可以用 ate 或 binary 模式打開。ate 模式隻在打開時有效:檔案打開後将定位在檔案尾。以 binary 模式打開的流則将檔案以位元組序列的形式處理,而不解釋流中的字元。

預設時,與 ifstream 流對象關聯的檔案将以 in 模式打開,該模式允許檔案做讀的操作:與 ofstream 關聯的檔案則以 out 模式打開,使檔案可寫。以out 模式打開的檔案會被清空:丢棄該檔案存儲的所有資料。

從效果來看,為 ofstream 對象指定 out 模式等效于同時指定了 out 和 trunc 模式。

對于用 ofstream 打開的檔案,要儲存檔案中存在的資料,唯一方法是顯式地指定 app 模式打開:

outfile2 的定義使用了按位或操作符将相應的檔案同時以out 和 trunc 模式打開。

對同一個檔案作輸入和輸出運算

fstream 對象既可以讀也可以寫它所關聯的檔案。fstream 如何使用它的檔案取決于打開檔案時指定的模式。

預設情況下,fstream 對象以 in 和 out 模式同時打開。當檔案同時以 in和 out 打開時不清空。如果打開 fstream 所關聯的檔案時,隻使用 out 模式,而不指定 in 模式,則檔案會清空已存在的資料。如果打開檔案時指定了 trunc模式,則無論是否同時指定了 in 模式,檔案同樣會被清空。下面的定義将copyOut 檔案同時以輸入和輸出的模式打開:

模式是檔案的屬性而不是流的屬性

每次打開檔案時都會設定模式

第一次調用 open 函數時,指定的模式是 ofstream::out。目前目錄中名為“scratchpad”的檔案以輸出模式打開并清空。而名為“precious”的檔案,則要求以添加模式打開:儲存檔案裡的原有資料,所有的新内容在檔案尾部寫入。

在打開“out”檔案時,沒有明确指明輸出模式,該檔案則以 out 模式打開,這意味着目前存儲在“out”檔案中的任何資料都将被丢棄。

隻要調用 open 函數,就要設定檔案模式,其模式的設定可以是顯式的也可以是隐式的。如果沒有指定檔案模式,将使用預設值。

打開模式的有效組合

打開檔案做寫操作,删除檔案中已有的資料

out | app

打開檔案做寫操作,在檔案尾寫入

out | trunc

與 out 模式相同

in | out

打開檔案做讀、寫操作,并定位于檔案開頭處

in | out | trunc

打開檔案做讀、寫操作,删除檔案中已有的資料

上述所有的打開模式組合還可以添加 ate 模式。對這些模式添加 ate 隻會改變檔案打開時的初始化定位, 在第一次讀或寫之前, 将檔案定位于檔案末尾處。

一個打開并檢查輸入檔案的程式

由于不清楚流 in 的目前狀态,是以首先調用 close 和 clear 将這個流設定為有效狀态。然後嘗試打開給定的檔案。如果打開失敗,流的條件狀态将标志這個流是不可用的。最後傳回流對象 in,此時,in 要麼已經與指定檔案綁定起來了,要麼處于錯誤條件狀态。