📜  C++中的I / O重定向

📅  最后修改于: 2021-05-30 10:14:12             🧑  作者: Mango

在C语言中,我们可以使用函数freopen()将现有的FILE指针重定向到另一个流。 freopen()的原型为

FILE * freopen ( const char * filename, const char * mode, FILE * stream );

例如,要将标准输出重定向为一个文本文件,我们可以编写

freopen ("text_file.txt", "w", stdout);

虽然C++仍支持此方法,但本文讨论了另一种重定向I / O流的方法。
C++是一种面向对象的编程语言,它使我们不仅能够定义自己的流,而且还可以重定向标准流。因此,在C++中,流是其行为由类定义的对象。因此,任何表现得像流的东西都是流。
C++中的Streams对象主要分为三种类型:

  • istream:此类型的Stream对象只能从该流执行输入操作
  • ostream:这些对象只能用于输出操作。
  • iostream:可用于输入和输出操作

所有这些类以及文件流类均从以下类派生:ios和streambuf。因此,文件流和IO流对象的行为类似。
所有流对象还具有类streambuf的关联数据成员。简单地说,streambuf对象是流的缓冲区。从流中读取数据时,我们不会直接从源中读取数据,而是从链接到源的缓冲区中读取数据。同样,首先在缓冲区上执行输出操作,然后在需要时刷新缓冲区(将其写入物理设备)。
C++允许我们为任何流设置流缓冲区。因此,重定向流的任务只是减少到更改与流关联的流缓冲区。因此,要将流A重定向到流B,我们需要执行以下操作:-

  1. 获取A的流缓冲区并将其存储在某处
  2. 将A的流缓冲区设置为B的流缓冲区
  3. 如果需要将A的流缓冲区重置为其先前的流缓冲区

我们可以使用函数ios :: rdbuf()来执行两个操作。

1) stream_object.rdbuf(): Returns pointer to the stream buffer of stream_object
2) stream_object.rdbuf(streambuf * p): Sets the stream buffer to the object pointed by p

这是下面的示例程序,显示了步骤

CPP
// Cpp program to redirect cout to a file
#include 
#include 
#include 
 
using namespace std;
 
int main()
{
    fstream file;
    file.open("cout.txt", ios::out);
    string line;
 
    // Backup streambuffers of  cout
    streambuf* stream_buffer_cout = cout.rdbuf();
    streambuf* stream_buffer_cin = cin.rdbuf();
 
    // Get the streambuffer of the file
    streambuf* stream_buffer_file = file.rdbuf();
 
    // Redirect cout to file
    cout.rdbuf(stream_buffer_file);
 
    cout << "This line written to file" << endl;
 
    // Redirect cout back to screen
    cout.rdbuf(stream_buffer_cout);
    cout << "This line is written to screen" << endl;
 
    file.close();
    return 0;
}


输出:

This line is written to screen
Contents of file cout.txt:
This line written to file

笔记:
以上步骤可以浓缩为一个步骤

auto cout_buf = cout.rdbuf(file.rdbuf())

// sets couts streambuffer and returns the old 
streambuffer back to cout_buf

参考:
CPP IOS

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”