zoukankan      html  css  js  c++  java
  • 【C++ IO机制】标准输入输出 ①

    标准输入输出

    1. cin 原型:

    template <class CharT, class Traits = std::char_traits<CharT>>
    class basic_istream : virtual public std::basic_ios<CharT, Traits>

    2. cout 原型:

    template <class CharT, class Traits = std::char_traits<CharT>>
    class basic_ostream : virtual public std::basic_ios<CharT, Traits>

    3. cerr 原型:

    template <class CharT, class Traits = std::char_traits<CharT>>
    class basic_ostream : virtual public std::basic_ios<CharT, Traits>

    【注意】

     extern istream cin;        // Linked to standard input
     extern ostream cout;       // Linked to standard output
     extern ostream cerr;       // Linked to standard error (unbuffered)

    iostream 现在是模板化的,同时支持窄字符和宽字符。下图是现在的继承体系,同时画出了 fstreams 和 stringstreams。图中方框的第二行是模板的具现化类型,也就是我们代码里常用的具体类型(通过 typedef 定义)。

    这个继承体系糅合了面向对象与泛型编程,但可惜它两方面都不讨好。

    再进一步加深了解,发现还有一个平行的 streambuf 继承体系,fstream 和 stringstream 的不同之处主要就在于它们使用了不同的 streambuf 具体类型。

    每个流(cout/cin/clog/ifstream/ofstream)都有自己的流缓冲区(streambuf)。通过rdbuf接口可以获取当前的streambuf,也可以设置新的streambuf。

    例如我们可以修改std::coutstd::stringstream使用同一块缓冲区:

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <sstream>
     4 
     5 int main()
     6 {
     7   std::stringstream ss;
     8   std::streambuf *cout_buf = std::cout.rdbuf();
     9   std::cout.rdbuf(ss.rdbuf());
    10   //使用了新的缓冲区后,字符串不会输出到屏幕,而是由stringstream管理
    11   std::cout << "std::cout hello world";
    12 
    13   // printf std::cout hello world
    14   printf("printf %s\n", ss.str().c_str());
    15 
    16   std::cout.rdbuf(cout_buf);
    17 
    18   return 0;
    19 }

    输出:

     参考资料

    1.std::streambuf从示例到应用

  • 相关阅读:
    数据库语句学习(union语句)
    终于开通博客了啦
    Winform用Post方式打开IE
    Winform webbrowser 隐藏 html 元素
    MVC 附件在线预览
    典型用户和场景
    我的第一篇博客01
    大数据算法摘录
    mac下查看端口占用情况
    tomcat的运行脚本
  • 原文地址:https://www.cnblogs.com/sunbines/p/15730406.html
Copyright © 2011-2022 走看看