2015-12-13 65 views
0
ofstream ofs1("file1.dat", ios::out | ios::binary); 

unsigned char data[64] = {0}; 
ofs1.write((char*) &data, sizeof(data)); 

if (some_condition) 
{ 
    ofstream ofs2("file2.dat", ios::out | ios::binary); 
    ofs2 << ofs1.rdbuf();// This does not work. 
} 

unsigned char more_data[32] = {1}; 
ofs1.write((char*) &more_data, sizeof(more_data)); 

與預期的一樣,file1.dat在執行代碼後大小爲96字節。但是,file2.dat是0字節,我期望它是64字節。顯然ofstream::rdbuf()總是空的,還是不應該這樣使用?爲什麼ofstream :: rdbuf()總是空的?

實際用途:使用相同標題(例如調色板)寫入多個文件的應用程序。在這個代碼示例中,data(調色板)的內容是靜態的,但它顯然可以被更復雜的計算所取代,這對於每個輸出文件都是重複過度的。

+2

'這不行。'它是'ofstream',底層緩衝區無法讀取。 – user657267

+0

但是,在刷新緩衝區內容之前,必須有一些方法來複制緩衝區內容? – Midas

+0

@Midas:它不打算從中讀取。僅僅存在緩衝區和知識的內容就是不應該暴露的實現細節。您可以編寫自己的包裝緩衝區,以記錄發送給它的信息。 –

回答

2

您的問題是ofstream默認情況下僅在輸出模式下打開其緩衝區,無論哪種方式,只傳遞std::ios_base::out,這意味着無法讀取緩衝區。

要解決此問題,您需要切換到使用fstream並使用std::ios_base::in | std::ios_base::out | std::ios_base::binary打開它。

您還需要在致電rdbuf前致電seekg(0, std::ios_base::beg)以尋求文件的開始。