博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOStream
阅读量:4135 次
发布时间:2019-05-25

本文共 1826 字,大约阅读时间需要 6 分钟。

一 Itream的概念
1 stream对象
stream就是一条流,是由某个类别出来的具有特定类型的对象,输出操作被定义为“数据流入stream”,操作被称为“数据流出stream”,有些的I/O通道(Channels)被定义为标准的全局对象,比如basic_istream<>的实例c,basic_ostream<>的实例cout。

2 stream类别
stream主要分为用于输入的stream和用于输出的stream,比如istream和ostream。

3 全局性的stream对象
毕竟C++兼容着C语言,不是纯OO,存在全局函数及全局变量的概念,但这不一定是坏事(那些唯OO的洁癖当作没看到),比如下面这些标准I/O通道所用到的全局对象。
1) cin(隶属于istream):是供使用者输入用的标准输入通道,对应于C的stdin。通常将他和键盘连接。
2) cout(隶属于ostream):是供使用者输出用的标准输出通道,对应于C的stdout。操作通常把他与显示器相连接。
3) cerr(隶属于ostream):是所有错误信息输出使用的标准输出通道,相对于C的stderr。操作系统通常也是把它和显示器相连接,缺省情况没有缓冲,因为错误要及时通知给。
4) clog(隶属于ostream):是标准通道,缺省状况下操作系统把它连接于cerr所连接的装置,但是clog是有缓冲区的。大量的log输出造成频繁I/O。

如果操作系统支持标准I/O通道的,则可以默认输出设备,比如将cin的默认输入设备改为一个,或一个由socket维护的stream。
4 让大家疑惑的移位运算符>> <<

初学C++的cin对象和cout对象时可能会对移位运算符<< >>产生疑问,其实移位运算符是在cin,cout所属类别中被了运算符重载,使其功能是像默认输出设备写数据和从默认输入设备读数据。

5 操控器 (manipulators)
到std::endl我以前一直以为它是一个宏定义或常量,表示不同操作系统的\n,刚刚发现第二个功能,它还在里面调用了一下flush()函数,刷新了缓冲区,也就是说你每次输出一个endl的时候,就会把缓冲区数据输出到磁盘中。
刚刚又发现vs里面的代码提示中,endl是一个函数,但是实际调用的时候都是直接用endl而不是endl()来调用的,我初步判断它可能同时重载了()的类,虚伪的函数。。
其他操控器还有如:
endl: 输出\n并刷新缓冲区
ends:输出\0
flush:刷新output缓冲区
ws:读入并忽略空格

最后是一个小例子

#include <cstdlib>

#include <iostream>
using namespace std;
int main()
{
    double x, y;        // operands
    // print header string
    cout << "Multiplication of two floating point values" << endl;
    // read first operand
    cout << "first operand:  ";
    if (! (cin >> x)) {
        /* input error
         *  => error message and exit program with error status
         */
        cerr << "error while reading the first floating value"
             << endl;
        return EXIT_FAILURE;
    }
  // read second operand
    cout << "second operand: ";
    if (! (cin >> y)) {
        /* input error
         *  => error message and exit program with error status
         */
        cerr << "error while reading the second floating value"
             << endl;
        return EXIT_FAILURE;
    }
    // print operands and result
    cout << x << " times " << y << " equals " << x * y << endl;
}

转载地址:http://pbsvi.baihongyu.com/

你可能感兴趣的文章
权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)
查看>>
Basketball Exercise CodeForces - 1195C(动态规划dp)
查看>>
Codeforces Global Round 4(ABCDE)
查看>>
subsequence 1(牛客多校第五场记忆化搜索+组合数学)
查看>>
Welfare State CodeForces - 1199D(线段树)
查看>>
linux下touch的运用以及在linux下创建可运行的.sh文件
查看>>
json和jsonp的使用格式
查看>>
Oracle密码过期,取消密码180天限制
查看>>
Linux下磁盘分区,格式化以及挂载
查看>>
Oracle创建用户并给用户授权查询指定表或视图的权限
查看>>
Linux下Oracle数据库自动备份Shell脚本
查看>>
Linux下oracle定时备份教程
查看>>
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
查看>>
Oracle报错,ORA-28001: 口令已经失效
查看>>
解决linux根目录磁盘空间满
查看>>
mysql报错ERROR 1054(42S22) Unknown column 'password' in ‘field list’
查看>>
nginx 负载均衡管理的项目均不能正常运行的原因
查看>>
MYSQL主从
查看>>
Linux下安装mysql5.7
查看>>
Linux下如何调整根目录的空间大小
查看>>