輸出檔資料流成員函式
輸出資料流的成員函式有三種類型:相當於操作工具的類型、會執行未格式化寫入作業的類型,以及其他會修改資料流狀態,且沒有對等的操作工具或插入運算子的類型。 對於循序的格式化輸出,您可能僅會使用插入運算子和操作工具。 對於隨機存取二進位磁碟輸出,您會使用其他的成員函式 (無論搭配插入運算子與否)。
輸出資料流的 open 函式
若要使用輸出檔案資料流 (ofstream
),您必須將該數據流與建構函式或函 open
式中的特定磁碟檔案產生關聯。 如果您使用 函 open
式,您可以使用一系列檔案重複使用相同的數據流物件。 不論使用哪一種,描述檔案的引數都一樣。
當您開啟與輸出數據流相關聯的檔案時,通常會指定 open_mode
旗標。 您可以將這些旗標結合在 類別中 ios
定義為列舉值,以及位 OR ( |
) 運算子。 如需列舉值的清單,請參閱 ios_base::openmode
。
有三種常見的輸出資料流情況會牽涉到模式選項:
建立檔案。 如果檔案已經存在,將會刪除舊版本檔案。
ofstream ofile("FILENAME"); // Default is ios::out ofstream ofile("FILENAME", ios::out); // Equivalent to above
將記錄附加至現有的檔案,或在不存在時建立記錄。
ofstream ofile("FILENAME", ios::app);
在相同的資料流上開啟兩個檔案,一次開啟一個。
ofstream ofile(); ofile.open("FILE1", ios::in); // Do some output ofile.close(); // FILE1 closed ofile.open("FILE2", ios::in); // Do some more output ofile.close(); // FILE2 closed // When ofile goes out of scope it is destroyed.
put
函式
函 put
式會將一個字元寫入輸出數據流。 下列兩個陳述式的預設值都相同,但第二個會受到資料流的格式引數影響:
cout.put('A');
// Exactly one character written
cout <<'A'; // Format arguments 'width' and 'fill' apply
write
函式
函 write
式會將記憶體區塊寫入輸出檔案數據流。 長度引數會指定要寫入的位元組數目。 這個範例會建立輸出檔案資料流,並將 Date
結構的二進位值寫入它:
// write_function.cpp
// compile with: /EHsc
#include <fstream>
using namespace std;
struct Date
{
int mo, da, yr;
};
int main( )
{
Date dt = { 6, 10, 92 };
ofstream tfile( "date.dat" , ios::binary );
tfile.write( (char *) &dt, sizeof dt );
}
函 write
式不會在到達 NULL
字元時停止,因此會寫入完整的類別結構。 此函式會採用兩個引數:char
指標和要寫入的字元計數。 請注意結構物件位址之前的必要轉換 char *
。
seekp 和 tellp 函式
輸出檔案資料流會保留內部指標,該指標指向接下來要寫入資料的位置。 seekp
成員函式會設定此指標,並提供隨機存取磁碟檔案輸出。 tellp
成員函式會傳回檔案位置。 如需使用相當於 和 之輸入數據流seekp
的範例,請參閱 和 tellg
函seekg
式。tellp
輸出資料流的 close 函式
成員 close
函式會關閉與輸出檔案數據流相關聯的磁碟檔案。 若要完成所有的磁碟輸出,必須先關閉檔案。 如有必要, ofstream
解構函式會為您關閉檔案,但如果您需要為相同的數據流對象開啟另一個檔案,您可以使用 函 close
式。
只有在建構函式或 open
成員函式開啟檔案時,輸出數據流解構函式才會自動關閉數據流的檔案。 如果您為已開啟的檔案傳遞建構函式的檔案描述元或使用 attach
成員函式,則必須明確地關閉檔案。
錯誤處理函式
寫入資料流時,請使用下列成員函式來測試是否發生錯誤:
函式 | 傳回值 |
---|---|
bad |
如果發生無法復原的錯誤,則傳 true 回 。 |
fail |
true 如果發生無法復原的錯誤或「預期的」條件,例如轉換錯誤,或找不到檔案,則傳回 。 使用零自變數呼叫 clear 之後,處理通常會繼續。 |
good |
true 如果沒有錯誤條件(無法復原或無法復原),且未設定檔案尾旗標,則傳回 。 |
eof |
傳 true 回檔尾條件。 |
clear |
設定內部錯誤狀態。 如果使用預設引數呼叫,它會清除所有錯誤位元。 |
[rdstate ](basic-ios-class.md#rdstate |
傳回目前的錯誤狀態。 |
運算子 !
會多載,以執行與函 fail
式相同的函式。 因此運算式︰
if(!cout)...
等於:
if(cout.fail())...
運算子 void*()
會多載為與運算符相反的 !
,因此表達式:
if(cout)...
等於:
if(!cout.fail())...
運算子 void*()
不等於 good
,因為它不會測試檔尾。