C++中的I/O重定向

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

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战


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

FILE * freopen ( const char * 文件名, const char * 模式, FILE * 流);
复制代码


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

freopen ("text_file.txt", "w", stdout);
复制代码


尽管 C++ 仍支持此方法,但本文讨论了另一种重定向 I/O 流的方法。


C++ 是一种面向对象的编程语言,让我们不仅能够定义自己的流,还能够重定向标准流。因此,在 C++ 中,流是一个对象,其行为由类定义。因此,任何行为类似于流的东西也是流。


C++中的Streams对象主要有以下三种类型:


  • istream : 这种类型的流对象只能从流中执行输入操作

  • ostream : 这些对象只能用于输出操作。

  • iostream : 可用于输入和输出操作


所有这些类以及文件流类都派生自以下类:ios 和 streambuf。因此,文件流和 IO 流对象的行为相似。


所有流对象也有一个关联的数据成员流缓冲类。简单地说,streambuf 对象是流的缓冲区。当我们从流中读取数据时,我们不会直接从源读取它,而是从链接到源的缓冲区中读取它。同样,输出操作首先在缓冲区上执行,然后在需要时刷新缓冲区(写入物理设备)。


C++ 允许我们为任何流设置流缓冲区。因此,重定向流的任务简单地简化为更改与流关联的流缓冲区。因此,要将流 A 重定向到流 B,我们需要执行以下操作:-


  1. 获取 A 的流缓冲区并将其存储在某处

  2. 将 A 的流缓冲区设置为 B 的流缓冲区

  3. 如果需要将 A 的流缓冲区重置为其先前的流缓冲区


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

1)stream_object.rdbuf():返回指向stream_object的流缓冲区的指针
2)stream_object.rdbuf(streambuf * p):设置流缓冲区为p指向的对象
复制代码


下面是一个示例程序来显示步骤

#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main()
{
  fstream file;
  file.open("cout.txt", ios::out);
  string line;
  streambuf* stream_buffer_cout = cout.rdbuf();
  streambuf* stream_buffer_cin = cin.rdbuf();
  streambuf* stream_buffer_file = file.rdbuf();
  cout.rdbuf(stream_buffer_file);
  cout << "This line written to file" << endl;
  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())
// 设置 couts 流缓冲区并将旧的
streambuffer back to cout_buf



目录
相关文章
|
7月前
|
存储 C++
C++的I/O流标准库
C++的I/O流标准库
54 2
|
7月前
|
程序员 API C语言
在C++语言的标准I/O库
在C++语言的标准I/O库
49 0
|
6月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
76 2
|
6月前
|
C++
C++对C的改进和拓展:I/O 流
C++对C的改进和拓展:I/O 流
30 1
|
7月前
|
编译器 C语言 C++
C++特性——命名空间、I/O流以及缺省参数
C++特性——命名空间、I/O流以及缺省参数
|
存储 iOS开发 C++
C++文件 I/O操作
C++文件 I/O操作
66 0
|
安全 C语言 C++
67 C++ - 标准I/O流
67 C++ - 标准I/O流
56 0