C ++中的I / O重定向

在C语言中,我们可以将freopen()函数用于重定向。使用此功能,我们可以将现有的FILE指针重定向到另一个流。freopen的语法如下:

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

同样在C ++中,我们可以进行重定向。在C ++中,使用流。在这里,我们可以使用自己的流,也可以重定向系统流。在C ++中,存在三种类型的流。

  • istream:流,仅支持输入

  • ostream:流,仅支持输出

  • iostream:这些可用于输入和输出。

这些类和文件流类是从ios和stream-buf类派生的。因此,文件流和IO流对象的行为类似。C ++允许将流缓冲区设置为任何流。因此,我们可以简单地更改与流关联的流缓冲区以进行重定向。例如,如果有两个流A和B,并且我们要将流A重定向到流B,则需要执行以下步骤:

  • 获取流缓冲区A,并将其存储

  • 将流缓冲区A设置为另一个流缓冲区B

  • 将流缓冲区A重置为其先前位置(可选)

范例程式码

#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
   fstream fs;
   fs.open("abcd.txt", ios::out);
   string lin;
   //备份流缓冲区
   streambuf* sb_cout = cout.rdbuf();
   streambuf* sb_cin = cin.rdbuf();
   //获取文件流缓冲区
   streambuf* sb_file = fs.rdbuf();
   //现在cout将指向文件
   cout.rdbuf(sb_file);
   cout << "该字符串将存储到文件" << endl;
   //从备份获取先前的缓冲区
   cout.rdbuf(sb_cout);
   cout << "再次在控制台的Cout缓冲区中" << endl;
   fs.close();
}

输出结果

再次在控制台的Cout缓冲区中

abcd.txt

该字符串将存储到文件