輸出檔案資料流成員函式
輸出資料流成員函式有三種類型: 相當於 manipulators,即執行 [設定格式的寫入作業,並修改其資料流的狀態,並沒有對等的 manipulator 或插入運算子。 循序的、 已格式化的輸出,您可能只使用插入運算子和 manipulators。 隨機存取二進位磁碟輸出,您使用其他成員函式,不論有插入運算子。
開啟的函式的輸出資料流
若要使用的輸出檔案資料流 (ofstream),您必須在此資料流關聯的建構函式中的特定磁碟檔案或 開啟函式。 如果您使用開啟函式,您可以重複使用相同的資料流物件,以一系列的檔案。 不論是哪一種情況中,描述檔案的引數是相同的。
當您開啟一個輸出資料流相關聯的檔案時,您通常指定 open_mode 旗標。 您可以結合這些旗標會定義在列舉值為ios類別,以位元的 OR (|) 運算子。 請參閱 ios_base::openmode 列舉值的清單。
三種常見的輸出資料流情況涉及模式選項:
建立檔案。 如果檔案已經存在,則會刪除舊的版本。
ostream 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.
放入函式
放函式會將一個字元寫入輸出資料流。 下列兩個陳述式是預設的情況下,相同,但第二個會受到影響的資料流格式引數:
cout.put( 'A' ); // Exactly one character written
cout << 'A'; // Format arguments 'width' and 'fill' apply
寫入函式
撰寫函式會將記憶體區塊寫入至輸出檔案資料流。 長度的引數指定寫入的位元組數目。 本範例建立輸出檔案資料流,並將寫入的二進位值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 );
}
撰寫函式不會停止,當它到達 null 字元,因此在撰寫完整的類別結構。 此函數使用兩個引數: char指標,要寫入的字元計數。 請注意所需的轉換至 char * 之前結構物件的位址。
Seekp 和 tellp 函式
輸出檔案資料流中保留的內部指標,指向 [下一步寫入資料的位置。 seekp成員函式設定 this 指標,並因此提供隨機存取磁碟檔案的輸出。 tellp成員函式傳回的檔案位置。 如需使用到的輸入資料流對等用法的範例seekp和tellp,請參閱 seekg 和 tellg 函數。
輸出資料流關閉的功能
關閉成員函式會關閉輸出檔案資料流相關聯的磁碟檔。 若要完成所有的磁碟輸出,就必須關閉檔案。 如有必要, ofstream解構函式會關閉檔案,但是您可以使用關閉函式,如果您需要開啟相同的資料流物件的另一個檔案。
輸出資料流的解構函式會自動關閉資料流的檔案才建構函式或開啟成員函式會開啟該檔案。 如果您傳入建構函式已經開啟檔案] 或 [使用的檔案描述項附加成員函式,您必須明確地關閉該檔案。
處理函式時發生錯誤
若要測試有錯誤時寫入資料流中使用這些成員函式:
Function |
傳回值 |
---|---|
傳回 ,則為 true 如果發生無法復原的錯誤。 |
|
傳回 ,則為 true 無法恢復的錯誤或"預期"的條件,例如轉換錯誤,或是找不到這個檔案。 處理通常可以繼續呼叫之後清除與為零的引數。 |
|
傳回 ,則為 true 如果沒有任何錯誤條件 (無法復原或其他原因),且未設定的檔案結尾旗標。 |
|
傳回 ,則為 true 上的檔案結尾的條件。 |
|
設定內部的錯誤狀態。 如果使用預設引數呼叫,它會清除所有的錯誤位元。 |
|
傳回目前的錯誤狀態。 |
The ! 運算子為多載來執行相同的功能 失敗函式。 因此運算式:
if( !cout)...
等於:
if( cout.fail() )...
Void*() 運算子為多載是相反的 **!**操作員。 因此運算式:
if( cout)...
相當於:
if( !cout.fail() )...
Void*() 運算子並不等於好因為它不會測試檔案結尾。