C++输入输出
重定向
标准输入输出流是控制台的输入和输出;文件的输入输出流是读写文件;如果把要打印的东西写入文件,就叫流stream的重定向。
C++中的流对象主要有三个类型:
- istream: 输入流的类
- ostream: 输出流的类
- iostream: 输入输出流的类
以上三个类加上文件流类,都是继承自ios和streambuf两个类。因此文件流和输入输出流的对象表现都很相似。
所有流对象都关联了streambuf类的数据成员。简单地说,streambuf对象是流的缓冲区/缓存区。当我们从流中读取数据时,我们并不是直接从源数据中读取,而是从链接着源数据的缓存区中读取;同理,写操作也都是先写到缓冲区,然后在需要的时候flush(写到物理设备去)。
C++允许我们为任何流设置流缓存(stream buffer)。所以重定向流,其实就变成了直接将流所关联的流缓存更换掉。因此,将流A重定向到流B的整个过程为:
- 获取A的流缓存,然后存储到某个地方;
- 将A的流缓存设置到B的流缓存;
- 如果有需要,将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.