C++重新導向

來源:互聯網
上載者:User

需求:一份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++重新導向

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.