istream
和 ostream
類。我們已經使用過這些類的物件:cin
是 istream
類的物件,cout
是 ostream
類的物件。因此,我們實際上已經在使用與檔案流相關的類了。事實上,我們可以像使用 cin
和 cout
一樣使用檔案流,唯一的區別是我們必須將這些流與物理檔案關聯起來。讓我們來看一個例子:
|
|
[file example.txt] Writing this to a file. |
example.txt
的檔案,並像我們習慣於使用 cout
那樣,向其中插入一個句子,但這裡使用的是檔案流 myfile
。myfile
)來表示,對此流物件執行的任何輸入或輸出操作都將應用於與之關聯的物理檔案。open
:open (filename, mode);
filename
是一個表示要開啟的檔名的字串,mode
是一個可選引數,它是以下標誌的組合:ios::in | 為輸入操作(讀取)而開啟。 |
ios::out | 為輸出操作(寫入)而開啟。 |
ios::binary | 以二進位制模式開啟。 |
ios::ate | 將初始位置設定在檔案末尾。 如果不設定此標誌,初始位置是檔案的開頭。 |
ios::app | 所有輸出操作都在檔案末尾進行,將內容追加到檔案當前內容的後面。 |
ios::trunc | 如果檔案是為輸出操作而開啟的,並且它已經存在,那麼它之前的內容將被刪除,並被新內容替換。 |
|
)進行組合。例如,如果我們想以二進位制模式開啟檔案 example.bin
來新增資料,我們可以透過以下呼叫成員函式 open
來實現:
|
|
ofstream
、ifstream
和 fstream
類的每個 open
成員函式都有一個預設模式,如果在開啟檔案時沒有提供第二個引數,就會使用這個預設模式:類 | 預設模式引數 |
---|---|
、ofstream | ios::out |
ifstream | ios::in |
fstream | ios::in | ios::out |
ifstream
和 ofstream
類,即使傳遞給 open
成員函式的第二個引數不包含 ios::in
或 ios::out
,它們也會被自動分別假定(這些標誌會被組合)。fstream
,預設值僅在呼叫函式時未指定任何模式引數值的情況下應用。如果呼叫該函式時為該引數指定了任何值,則預設模式將被覆蓋,而不是組合。open
成員函式,並且引數與該成員完全相同。因此,在我們之前的例子中,我們也可以透過以下方式宣告 myfile
物件並執行相同的開啟操作:
|
|
is_open
來實現。如果流物件確實與一個開啟的檔案相關聯,該成員函式返回一個 bool
值為 true
,否則返回 false
。
|
|
close
。這個成員函式會重新整理相關的緩衝區並關閉檔案。
|
|
close
。ios::binary
標誌的流。這些檔案旨在儲存文字,因此所有輸入或輸出它們的值都可能經歷一些格式轉換,這些轉換不一定與其字面二進位制值相對應。cout
的方式相同:
|
|
[file example.txt] This is a line. This is another line. |
cin
的相同方式進行:
|
|
This is a line. This is another line. |
true
;如果已到達檔案末尾或發生其他錯誤,則為 false
。bool
值):bad()
true
。例如,當我們試圖向一個未以寫入模式開啟的檔案寫入,或者我們試圖寫入的裝置沒有剩餘空間時。fail()
bad()
相同的情況下返回 true
,但當發生格式錯誤時也返回 true
,例如當我們試圖讀取一個整數時卻提取了一個字母字元。eof()
true
。good()
true
的情況下,它都返回 false
。注意,good
和 bad
並非完全相反(good
一次性檢查更多的狀態標誌)。clear()
可以用來重置狀態標誌。ifstream
,像 istream
一樣,保持一個內部的獲取位置 (get position),即下一次輸入操作要讀取的元素的位置。ofstream
,像 ostream
一樣,保持一個內部的放置位置 (put position),即下一個元素必須被寫入的位置。fstream
,像 iostream
一樣,同時保持獲取位置和放置位置。streampos
的值,該型別表示當前的獲取位置(對於 tellg
)或放置位置(對於 tellp
)。seekg ( position );
seekp ( position );
position
(從檔案開頭算起)。此引數的型別是 streampos
,與 tellg
和 tellp
函式返回的型別相同。seekg ( offset, direction );
seekp ( offset, direction );
direction
確定的特定點的偏移值。offset
的型別是 streamoff
。而 direction
的型別是 seekdir
,它是一個列舉型別,用於確定偏移量從哪個點開始計算,並且可以取以下任何值:ios::beg | 從流的開頭計算偏移量 |
ios::cur | 從當前位置計算偏移量 |
ios::end | 從流的末尾計算偏移量 |
|
|
size is: 40 bytes. |
begin
和 end
使用的型別:
|
|
streampos
是用於緩衝區和檔案定位的特定型別,也是 file.tellg()
返回的型別。這種型別的值可以安全地與同類型的其他值相減,也可以轉換為足以容納檔案大小的整數型別。streampos
和 streamoff
。這些型別也被定義為流類的成員型別:型別 | 成員型別 | 描述 |
---|---|---|
streampos | ios::pos_type | 定義為 fpos<mbstate_t> 。它可以與 streamoff 相互轉換,並且可以與這些型別的值進行加減運算。 |
streamoff | ios::off_type | 它是基本整數型別之一(如 int 或 long long )的別名。 |
<<
和 >>
)以及像 getline
這樣的函式來讀寫資料是低效的,因為我們不需要格式化任何資料,而且資料很可能不是按行格式化的。write
和 read
。第一個(write
)是 ostream
的成員函式(由 ofstream
繼承)。而 read
是 istream
的成員函式(由 ifstream
繼承)。fstream
類的物件兩者都有。它們的原型是:memory_block
的型別是 char*
(指向 char
的指標),表示一個位元組陣列的地址,讀取的資料元素儲存在這裡,或者要寫入的資料元素從這裡獲取。size
引數是一個整數值,指定要從記憶體塊中讀取或寫入的字元數。
|
|
the entire file content is in memory |
ios::ate
標誌開啟,這意味著獲取指標將被定位在檔案的末尾。這樣,當我們呼叫成員函式 tellg()
時,我們將直接獲得檔案的大小。
|
|
|
|
streambuf
的內部緩衝區物件相關聯。這個緩衝區物件可以代表一個記憶體塊,作為流和物理檔案之間的中介。例如,對於一個 ofstream
,每次呼叫成員函式 put
(寫入單個字元)時,該字元可能會被插入到這個中間緩衝區,而不是直接寫入到與流關聯的物理檔案中。![]() 預處理器指令 | ![]() 目錄 |