C++输入输出

重定向

标准输入输出流是控制台的输入和输出;文件的输入输出流是读写文件;如果把要打印的东西写入文件,就叫流stream的重定向

C++中的流对象主要有三个类型:

  • istream: 输入流的类
  • ostream: 输出流的类
  • iostream: 输入输出流的类

以上三个类加上文件流类,都是继承自ios和streambuf两个类。因此文件流和输入输出流的对象表现都很相似。

所有流对象都关联了streambuf类的数据成员。简单地说,streambuf对象是流的缓冲区/缓存区。当我们从流中读取数据时,我们并不是直接从源数据中读取,而是从链接着源数据的缓存区中读取;同理,写操作也都是先写到缓冲区,然后在需要的时候flush(写到物理设备去)。

C++允许我们为任何流设置流缓存(stream buffer)。所以重定向流,其实就变成了直接将流所关联的流缓存更换掉。因此,将流A重定向到流B的整个过程为:

  1. 获取A的流缓存,然后存储到某个地方;
  2. 将A的流缓存设置到B的流缓存;
  3. 如果有需要,将A的流缓存重置为之前的流缓存。

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

1) stream_object.rdbuf(): 返回指向stream object的stream buffer的指针;
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到文件
    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;
}

C++中的输入和输出都是以流(stream)的形式来执行的,流就是字节序列,分为输入流/输出流。

包含输入输出操作的头文件有:

  • iostream:标准输入输出流,头文件包含cin, cout, cerr等
  • iomanip:全称为input output manipulators,包含一些setw, setprecision等定义
  • fstream:文件流

cout是ostream类的实例,使用插入运算符<<,理解成把内容注入到cout中去,

cout << "hello, world"

无缓存标准错误流cerr,缓存标准错误流clog.

posted @ 2021-03-10 00:39  YoungF  阅读(127)  评论(0编辑  收藏  举报