C++基础教程示例详解:C++中的I/O重定向
在C語言中,我們可以使用函數freopen()將現有文件指針重定向到另一個流。freopen()的原型如下
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
例如,要將stdout重定向為文本文件,我們可以編寫
freopen ("text_file.txt", "w", stdout);
雖然在C++中仍然支持這種方法,但本文將討論另一種重定向 I/O streams的方法。
C++作為一種面向對象的編程語言,不僅使我們能夠定義自己的流,而且還可以重定向標準流。因此,在C++中,流是一個對象,其行為由類定義。因此,任何表現得像流的東西都是流。
C++中的流對象主要有三種類型:
istream : 此類型的流對象只能從流執行輸入操作
ostream :?這些對象只能用于輸出操作。
iostream : 可以同時用于輸入和輸出操作
顧名思義
i代表輸入input
o代表輸出output
stream//流
iostream//輸入輸出流,這只是C++的一個流文件,因為C++的輸入輸出都是流處理的
istream//就是只管輸入的流
ostream//就是只管輸出的流
(理論上應該是iostream包含了istream和ostream。但是如果只想使用ostream中的某個功能卻使用了這個iostream,而iostream比較大,又包含了istream,那么這樣的調用會浪費資源)
所有這些類以及文件流類都派生自以下類:ios和streambuf。因此,filestream和IO流對象的行為類似。
所有流對象還具有類streambuf的關聯數據成員。簡單地說,streambuf對象是流的緩沖區。從流中讀取數據時,我們不會直接從源中讀取數據,而是從鏈接到源的緩沖區中讀取數據。同樣,首先在緩沖區上執行輸出操作,然后在需要時刷新緩沖區(將其寫入物理設備)。
C++允許我們為任何流設置流緩沖區。因此,重定向流的任務只不過是更改與流相關聯的流緩沖區。因此,我們需要將流A重定向到流B
獲取A的流緩沖區并將其存儲在某處
將A的流緩沖區設置為B的流緩沖區
如果需要,將A的流緩沖區重置為其先前的流緩沖區
我們執行重定向操作使用ios::rdbuf()方法。對于這個方法,如果不傳參數,那么直接返回流對象的buffer指針。如果傳遞了某個流對象的buffer指針,那么將當前的流對象綁定到那個傳遞過來的流對象的buffer上。
我們可以使用函數 ios::rdbuf()來執行兩次操作。
1) stream_object.rdbuf(): 返回流對象buffer
2) stream_object.rdbuf(streambuf * p): 綁定流對象buffer
下面是一個演示步驟的示例程序
// Cpp程序將cout重定向到文件 #include #include #include using namespace std; int main() { fstream file; file.open("cout.txt", ios::out); string line; // cout的備份流緩沖區streambuf* stream_buffer_cout = cout.rdbuf(); streambuf* stream_buffer_cin = cin.rdbuf(); // 獲取文件的streambuffer streambuf* stream_buffer_file = file.rdbuf(); // 將cout重定向到文件cout.rdbuf(stream_buffer_file); cout << "Linux迷www.linuxmi.com這行寫入文件" << endl; // 將cout重定向回屏幕cout.rdbuf(stream_buffer_cout); cout << "www.linuxmi.com這一行被寫入屏幕" << endl; file.close(); return 0; }屏幕輸出:
www.linuxmi.com這一行被寫入屏幕
下面這一行將寫入文件
Linux迷www.linuxmi.com這行寫入文件
注意:
以上步驟可以壓縮為一個步驟
auto cout_buf = cout.rdbuf(file.rdbuf())
// 設置流緩沖區和返回先前的
streambuffer back to cout_buf
OK,本文就這樣,有什么不對的地方請指正。
來源:https://www.linuxmi.com/io-redirection-c.html
總結
以上是生活随笔為你收集整理的C++基础教程示例详解:C++中的I/O重定向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询linux系统版本命令(查询linu
- 下一篇: linux推荐书籍2020(linux推