[轉]c++流緩衝---rdbuf()

C++標準庫封裝了一個緩衝區類streambuf,以供輸入輸出流對象使用。每一個標準C++輸出輸出流對象都包含一個指向streambuf的指針,用 戶能夠經過調用rdbuf()成員函數得到該指針,從而直接訪問底層streambuf對象。所以,能夠直接對底層緩衝區進行數據讀寫,從而跳過上層的格 式化輸入輸出操做。
對於文件流類和字符串流類,分別派生了相應的流緩衝區類型,參考最後面的代碼:
流對象經過調用rdbuf()得到了底層streambuf對象的指針,也就能夠經過該指針調用streambuf支持你各類操做進行輸入輸出。本文對這些操做不予討論,在這裏主要介紹如何利用該指針實現文件內容的輸出。
輸出流提供了一個重載版本operator<<,它以streambuf指針爲參數,實現把streambuf對象中的全部字符輸出到輸出流 出中;輸入流也提供了一個對應的operator>>重載版本,把輸入流對象中的全部字符輸入到streambuf對象中。輸入流的get成 員重載版本中還有以streambuf指針爲參數的版本,也能夠用來把輸入流的東西寫入到輸出流緩衝區中。ios

下面用三種方法實現把一個文件的內容輸出標準輸出(固然還能夠經過普通的標準格式化輸入輸出完成):
法一:經過operator<<緩存

#include <iostream> 
#include <fstream> 
using namespace std; 
int main() 
{ 
ifstream fin("source.dat"); 
cout<<fin.rdbuf(); //猜想實際上緩存的數據載體就是一個char*,而後重載了<<運算符
return 0; 
} 

法二:利用get成員函數函數

ifstream fin("source.dat"); //get裏邊傳入什麼參數,就把流的內容輸入到什麼裏邊,這是輸入流的基本概念
while (!fin.get(*cout.rdbuf()).eof()) { // extract a line input 
if (fin.fail()) // blank line 
fin.clear(); 
cout<<char(fin.get()); // extract '\n' 
}

代碼解釋:因爲上面代碼中的get版本在遇到'\n'字符時,結束提取,因此須要用循環實現整個文件內容的輸出。另外,當此版本get函數遇到空行 時,由於沒有提取到任何字符(注意:get不提取回車符),注意會設置失敗標誌ios::failbit,因此此時應當調用clear()函數清除錯誤標 志。一樣,由於該版本get不會提取回車符,因此須要用另外一版本的get()提取回車符。spa

法三:利用重載的get函數指針

ifstream fin("main.cpp"); 
fin.get(*cout.rdbuf(), EOF);

代碼解釋:這個版本的get成員函數能夠自定義提取終止符。這裏經過設置爲文件結束符(EOF)來達到一下提取整個文件的目的。code

固然,你能夠把上面的cout換成任意的輸出流,好比文件輸出流,從而能夠實現文件的拷貝功能。對象

另外,上面代碼中並無使用輸入流的>>操做符,由於>>和<<是相對的,只是把操做數交換一下位置罷了。所以,你 能夠把上面代碼中用out<<blog

相關文章
相關標籤/搜索