zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    “校园知网”5月11日冲刺计划书
    “校园知网”5月10日冲刺计划书
    “校园知网”5月9日冲刺计划书
    学习进度
    “校园知网”5月8日冲刺计划书
    “校园知网”5月7日冲刺计划书
    “校园知网”5月6日冲刺计划书
    “校园知网”5月5日冲刺计划书
    “校园知网”5月4日冲刺计划书
    04-课后作业2-动手动脑及String类整理
  • 原文地址:https://www.cnblogs.com/YoungF/p/14509185.html
Copyright © 2011-2022 走看看