需求:一份C++源碼中許多 cout<<....<<endl ,終端總是輸出很多資訊,現在想把這些輸出定位到一個檔案中去,所以希望可以實現cout的重新導向功能。
實現: 將標準輸出(cout)重新導向到檔案out.txt中
freopen("out.txt","w",stdout);
該函數一般用於對標準輸入、標準輸出以及標準出錯流的重新導向,實驗證明對於普通的檔案重新導向本函數也可以完成。首先獲得FILE指標
FILE *lpf = fopen("out.txt","w");
然後還是通過函數freopen進行檔案流的重新導向,freopen函數的定義如下:
FILE *freopen(const char *filename,const char *type, FILE *stream);
所以重新導向語句為:
freopen("outb.txt","w",lpf);
測試下重新導向效果
fprintf(lpf,"hello world");
結果顯示,“hello world”出現了檔案outb.txt中,重新導向成功。
以上這些都是C語言範圍內的重新導向機制,C++重新導向主要由函數rdbuf完成。rdbuf原型如下兩個重載函數:
streambuf* rdbuf () const; ①streambuf* rdbuf (streambuf*) ; ②
C++流有個“成員變數”叫流緩衝區streambuf,①函數獲得流緩衝區,②函數設定流緩衝區。如下代碼:
streambuf *streamBuf; ③ifstream fin; ④fin.open("data.in"); ⑤backup = cin.rdbuf(); ⑥cin.rdbuf(fin.rdbuf()); ⑦cin.rdbuf(streamBuf); ⑧
其中語句⑥擷取儲存輸入檔案的流緩衝區,語句⑦將標準輸入的流緩衝區從預設的控制台流緩衝區變為檔案的流緩衝區,⑧函數恢複標準輸入的流緩衝區。現做如下測試:
ofstream outf(“out.txt”);streambuf * buf;buf = cout.rdbuf();cout.rdbuf(outf.rdbuf());cout<<"C++ file stream"<<endl;cout.rdbuf(buf);cout<<hello world<<endl;
結果顯示,語句“C++ file stream”進入檔案out.txt中,終端顯示“hello world”。
C++的流緩衝區的模式,為編程帶來了方便,並且由於C++採用的是底層的流緩衝模式,具有較高的效率。
參考文章:
http://blog.sina.com.cn/s/blog_0001988f0100njup.html C++流 rdbuf()
http://hi.baidu.com/gluce/item/d5d4f2340263d04c3175a12f C/C++重新導向