2010-01-26 251 views
13

我有以下代碼,它工作得很好(除了它很慢的事實,但我不太在意)。這似乎並不直觀,它會將整個infile的內容寫入outfile。ifstream :: rdbuf()實際上做了什麼?

// Returns 1 if failed and 0 if successful 
int WriteFileContentsToNewFile(string inFilename, string outFilename) 
{ 
    ifstream infile(inFilename.c_str(), ios::binary); 
    ofstream outfile(outFilename.c_str(), ios::binary); 

    if(infile.is_open() && outfile.is_open() && infile.good() && outfile.good()) 
    { 
     outfile << infile.rdbuf(); 

     outfile.close(); 
     infile.close(); 
    } 
    else 
     return 1; 

    return 0; 
} 

任何見解?

+1

我想補充一點,不需要對close()進行顯式調用。無論如何,析構函數都會這樣做。這節省了一些線。 ;) – 2015-05-22 22:15:59

回答

12

是的,它是在標準中指定的,它其實很簡單。 rdbuf()只是返回一個指針,指向給定的[io]stream對象的基礎basic_streambuf對象。

basic_ostream<...>對於指向basic_streambuf<...>operator<<有一個過載,其中寫出basic_streambuf<...>的內容。

+2

但是不會運營商<<只寫出一個塊?不容易看出它會把整個事情寫成一個大塊。我知道這是一個指向它的指針,但該指針是否包含整個數據作爲一個塊?我仍然有點困惑。 – 2010-01-26 19:12:03

+3

我不太確定你在駕駛'一個大塊頭'?它被指定爲逐字符輸出指向'streambuf'的內容,直到達到緩衝區的末尾或輸出錯誤。 'streambuf'是一個類實例,它是否將其受控序列存儲在連續內存中沒有被指定,並且不能從接口推斷出來。 – 2010-01-26 19:17:56

+0

好吧,它會逐字符地執行,直到達到緩衝區的末尾。你怎麼知道?我沒有從提供的界面中看到。 – 2010-01-26 19:33:56

15

iostream類只是I/O緩衝區的包裝。 iostream本身並沒有做很多...主要是它提供了格式化運算符operator>>。緩衝區由來自basic_streambuf的對象提供,您可以使用rdbuf()來獲取和設置緩衝區。

basic_streambuf是與一些其是重寫,以提供用於讀/寫文件,字符串,一個統一的接口虛擬函數的抽象基等功能basic_ostream<…>::operator<<(basic_streambuf<…>)被定義爲保持通過所述緩衝器讀取直到底層數據源是累。

iostream雖然是一個可怕的混亂。

+0

我同意,這是一個很好的答案,但查爾斯首先提交了他的答案,所以他是贏家。我雖然贊成你的答案! – 2010-01-26 23:33:29

相關問題