• 关于C++中的重定位


    "标准库定义了4个IO对象,处理输入时使用命名为cin的istream类型对象,这个对象也成为标准输入。处理输出时使用命名为cout的ostream类型对象,这个对象也称为标准输出。标准库还定义了另外两个ostream对象,分别命名为cerr和clog。cerr对象又叫标准错误,通常用来输出警告和错误信息给程序的使用者,而clog对象用于产生程序执行的一般信息。一般情况下,系统将这些对象与执行窗口联系起来,这样,当我们从cin读入时,数据从执行程序的窗口读入,当写到cout、cerr、clog时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或者输出的方法。利用重定向可以将这些流与所选择的文件联系起来" ---------------------C++ Prime

    重新开始看了这本书,决定哪里看不懂的就扣一下。如上文中的重定位。

    翻阅其他资料,做记录,以便以后复习。

     

    1.cout cerr clog都是ostream对象。cout clog 和 cerr 的区别在于有没有经过缓冲区输出以及能不能被重定位

    cout是在终端显示器输出,cout流在内存中有自己对应的一个缓冲区,用来存放流中的数据,当向cout流插入一个endl,不论缓冲区是否满了,都立即输出流中所有数据,刷新终端,一般是屏幕,然后插入一个换行符。cout还可以输出重定向到文件(实际上就是一个管道的一头连输出流,另一头连文件输入流)。当缓冲区满了,但是还没有被消耗的情况下会出现被阻塞的问题。

    cerr是指定为和显示器关联的,cerr没有缓冲区,直接刷新终端。并且一般只能输出到终端,不能被重定向。(但下面例子中的外部重定向可以实现cerr的重定向。)

    tip:c是console的意思啊~~~

    2.重定向的实现

    #include <iostream>

    int main()

    {

      std::cout << "cout" <<std::endl;

      std::cerr << "cerr" <<std::endl;

      std::clog << "clog" <<std::endl;

      return 0;

    }

    先通过编译器生成以上的 Cprogram.exe。再在cmd下运行此程序:

    命令行操作符>用于对cout进行重定向,操作符1>对cout进行重定向,操作符2>对cerr和clog进行重定向。

    三次中Cprogram.log中 分别是cout;cout;cerr clog。 即分别是终端中缺省的哪些输出内容,因其被重定向到了Cprogram.log中。

    以上是操作系统重定向,称为外部重定向;

    下面的都是 内部重定向的实现

    #include <iostream>
    #include <fstream>
    using namespace std;
    int main()
    {
       ifstream in("main.cpp"); //从文件中读取的类型 in 用main.cpp初始化in  
       cout<<in.rdbuf()<<endl; //rdbuf()是一个成员函数,文件的全部内容
       return 0;
    }

    输出内容为就是main.cpp里面的内容:

    C++中rdbuf重定向流的经典例子:

    int main()

    {

    ofstream file("cjf.txt");

    streambuf *log = clog.rdbuf(file.rdbuf());

    //每个输入输出流对象包含一个成员函数rdbuf(),它返回的是一个指向对象streambuf的指针.通过这个指针可以对streambuf对象进行存取.

    //写了这句以后,下面遇到clog输出,就输出到cjf.txt中了,具体就是通过log对象指针来重定向的吧

    cout << "cout" <<endl;

    cerr << "cerr" <<endl;

    clog << "clog" <<endl;

    clog.rdbuf(log);//重定位结束。下面的you are 会输出在终端上 而非cjf.txt中

    clog << "you are" <<endl;

    system("pause");

    //同理 foo.txt中的内容是 :重定向的内容.终端屏幕无输出。

    ofstream log("foo.txt");

    streambuf * oldbuf =  cout.rdbuf(log.rdbuf());

    cout << "重定向的内容/n" ;

    return 0;

    }

    重定向clog对象到cjf.txt文件对象,同样cout,cerr也可以进行同样的重定向

    可以利用rdbuf()重新指向到流设备(文本文件、串口等等)。

     整理着整理着又看到了第8章 标准IO库

     这篇文章是iostream 的用途与局限:http://www.cppblog.com/Solstice/archive/2011/07/17/151224.html

  • 相关阅读:
    2019年有谁放弃了创业当老板,选择打工或者待业?
    为什么很多人说现在做什么生意都不好做?
    创业是不是很难,假如只有500块如何创业?
    为什么生意越来越难做?
    我现在想做熟食行业,不知道现在的前景怎么样,能行吗?
    在北京十万元创业干什么好?
    风投公司会不会抄袭创业者的模式?
    利用快手抖音做小吃培训,年入100000+
    写车评兼职赚钱项目,每月稳赚2000-5000元
    【瓷博会】宝瓷林《锦绣中华》发布会
  • 原文地址:https://www.cnblogs.com/fulina/p/4486467.html
Copyright © 2020-2023  润新知