c++ 重定向

  1. 流类库
    1. 流库是用继承方法建立的输入输出类库
    2. 流库具有两个平行的基类:streambuf和ios类,所有流类均已两者之一作为基类
    3. streambuf类提供对缓冲区的低级操作:设置缓冲区,对缓冲区指针操作,向缓冲区存/取字符
    4. ios类以及派生类提供使用流类的接口,支持对streambuf的缓冲区输入/输出的格式化或者非格式化转换。
  2. c++ 重定向_第1张图片
  3. c++ 重定向_第2张图片
  4. 标准流
    1. 标准输入流cin输入到内存,标准输出流cout到屏幕
    2. 标准流为用户常用的外部设备提供与内存之间的通信通道,对数据进行解释和传输,提供必要的数据缓冲。
    3. cin:istream类的对象,通常连向键盘,可以重定向
    4. cout:ostream类的对象,通常连向显示器,可以重定向
    5. cerr:ostream类的对象,连向显示器,不可以重定向
    6. clog:ostream类的对象,连向打印机,不可以重定向
  5. c语言重定向到文件
    1. freopen(“data.in”, “r”, stdin);
      freopen(“data.out”, “w”, stdout);
      //这样就把标准输入重定向到了data.in文件,标准输出重定向到了data.out文件。
      //这两句代码之后,scanf函数就会从data.in文件里读,而printf函数就会输出到data.out文件里了。
  6. c++中流是一个对象,所以任何有流这种行为的对象也是流对象
    1. 流对象主要分为三种类型:
      1. istream: 主要是从流中执行输入操作
      2. ostream:主要是从流中执行输出操作
      3. iostream:主要是从流中执行输入输出操作
    2. 每个流对象都关联一个流buffer,程序一般从buffer中读取数据,所以如果要重定向流,只需要把buffer对象指向另外一个流即可
    3. 所有的流对象都关联了一个类成员数据streambuf,它就是stream的缓冲区(buffer)。C++读取输入输出的时候是从buffer中读取,而不是源数据流读取。
  7. 函数介绍
    1. stream_object.rdbuf(); //返回流对象buffer
      stream_object.rdbuf(streambuf * p); //绑定流对象buffer
      //如果不传参数,那么直接返回流对象的buffer指针。如果传递了某个流对象的
      //buffer指针,那么将当前的流对象绑定到那个传递过来的流对象的buffer上
  8. c++重定向到文件
  9. streambuf *backup;
    ifstream fin;
    fin.open("test.txt");
    backup = cin.rdbuf();   // 备份下 cin's streambuf
    cin.rdbuf(fin.rdbuf()); //  assign file’s streambuf to cin
    
    //恢复原来的输入流
    cin.rdbuf(backup);  // 把cin又重定向回了控制台
    //fin.close();

      你可能感兴趣的:(c++ 重定向)