【C++】《C++标准程序库》小结第十三章-stream(1)

来源:互联网 发布:淘宝有好货怎么收费 编辑:程序博客网 时间:2024/04/28 18:32

本章内容太多,分多次写完。这里存在的一个争议就是,是选择标准stream还是传统的C输入输出函数?

就性能而言,毫无疑问C函数要高,但是普通的测试下,stream和C函数的性能差距没达到10倍以上,因此普通应用场景下两者并没有区别。

stream优势在于使用模板编写,数据通用性强,尤其是可以解决国际化问题。

操作便利程度而言,两者各有千秋。

总的来说做应用用stream,做底层和高性能用C函数。Google编码规范建议主要用C的输入输出函数。

 

(一)基本概念

1、全局通用函数有

a)             cin标准输入通道,对应于stdin。宽字符为wcin

b)            cout标准输出通道,对应于stdout宽字符为wcout

c)             cerr。标准错误输出通道。对应于stderr。其实现目标之一是,将信息输入文件,同时把错误信息输出到控制台。宽字符为wcerr

d)            clog。标准logging通道。宽字符为wclog

 

注意:连续读入两个数据:

cin >> x >> y;

但是如果这样做,就出错:

cin >>x;

cin>>y;

y的值变成了回车。

正确做法是清理缓冲区:

cin >>x;

cin.clear();

cin.sync();//清空剩余缓冲区

cin >> y;

 

C函数有时候也面临同样的问题:

scanf(“%d”, &x);

scanf(“%d”, &y);

y等于回车。

正确做法:

scanf(“%d”, &x);

fflush(stdin);//清空输入缓冲区

scanf(“%d”, &y);

 

 

2、操控器专门操控stream对象,一般改变格式化解释方式。

操控器

作用

endl

输出’\n’,然后刷新输出缓冲区

ends

输出’\0’

flush

刷新输出缓冲区

ws

读入并忽略空格

 

(二)基本stream类别

1、基类ios_base定义了状态和标志位

2、basic_ios继承ios_base,这里主要是type_traits

3、basic_istream和basic_ostream虚拟继承basic_ios,主要是避免ios_base的重复继承。定义了读\写对象。

4、basic_iostream多重继承了basic_istream和basic_ostream,定义了可读可写对象。

5、basic_sreambufiostream库的核心,基本所有的读写接口在这里定义。是实际进行字符读写操作的代码。

6、stream buffer class的用途。iostream严格按照“职责分离”原则编写。basic_ios只定义了对象和操作格式,其实关键的都没有。basic_ios负责调用和维护stream buffer。stream buffer提供了缓冲区,同时提供了实际的读写操作。

7、特殊IO

类别

说明

bool

真就是1,假就是0,其他会报错

char*

用以下方法设置字符串最大80个字符:

char buffer[81];

cin>>setw(81)>>buffer

void*

打印地址

 

(三)状态

1、iostate常数反映stream状态。不过这个东西很多人都很头疼。调用的时候得加上作用域:std::ios_base::eofbit或者std::ios::eofbit。

常量

意义

goodbit

完全正常

eofbit

遇到末尾标记

failbit

错误

badbit

不确定的毁灭性的错误,必须得停止

2、eofbit和failbit经常一起出现。

3、关于状态的成员函数

成员函数

意义

good()

正常返回true

eof()

遇到末尾标记,返回true

fail()

发生错误,返回true

bad()

毁灭性的错误,返回true

rdstate()

返回当前已经设立的所有标志

clear()

清除所有标志

clear(state)

清除标志,在设立state标志

setstate(state)

加设state标志

比如只清除failbit标志位:

strm.clear(strm.rdstate()& !std::ios::failbit);

如果发生错误,必须手动清除错误标志位后,才能继续下一步操作。

4、布尔表达式转化

成员函数

意义

operator void *

stream没出错

operator ! ()

stream出错

注意这两个重载函数返回bool,而不是stream类。例子:

whilestd::cin{

....}

while(std::cin >>x){

...}

while!std::cin{

....}

while(!(std::cin>> x)){

...}//注意要打括号!

 

(四)异常

成员函数

意义

exceptions(flags)

设定会引发异常的标志

exception

返回引发异常的标志

对所有标志抛出异常:

strm.exceptions(std::ios::eofbit |std::ios::failbit | std::ios::badbit);

但是传入0和goodbit是不会引发异常。

 

抛出的异常是std::ios_base::failure对象,继承自exception,是个标准的异常安全类,用法也一样。

例子:

try{

输入输出操作。。。

}

catch(const ios::failure& err){

cerr << “,IOexception : ” << err.what() << endl;

returnEXIT_FAILURE;

}

catch(const exception& err){

cerr << “,Standardexception : ” << err.what() << endl;

returnEXIT_FAILURE;

}

catch(...){

cerr << “unknownerror” << endl;

returnEXIT_FAILURE;

}


 

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 买完机票后护照丢了怎么办 填简历时籍贯写了汉怎么办 深圳公租房住满5年后怎么办 深圳公租房住满6年后怎么办 没单位了个人不想交社保怎么办 北京公租房住满5年后怎么办 部落冲突怎样看账号密码忘了怎么办 摩托车闯红灯4次扣24分怎么办 星巴克金星级会员到期了怎么办 2018年驾照到期换证色弱怎么办 怀孕5个月咳嗽有痰怎么办 广州驾照换证体检视力不过怎么办 驾照12分扣完了怎么办费用标准 驾照体检出绿色盲不能补证怎么办 在交警队驾驶员陈述笔录写错怎么办 学驾照做体检把电话填错了怎么办 驾考中心考场停考预约的考试怎么办 口令卡绑定第一次身份证输错怎么办 第一次去医院看病没带身份证怎么办 考科目二紧张怎么办如何消除紧张 考科目三紧张怎么办如何消除紧张 我的驾考准考证和发票丢了怎么办 科目二预约考试下一步点不了怎么办 护士资格证未注册过期没注册怎么办 上海护士延续体检有乙肝携带怎么办 护士资格证从诊所变更到医院怎么办 杭州驾考预约面授没有去怎么办 在外地考的驾驶证丢了怎么办 身份证和驾驶证在外地丢了怎么办 我有摩e照学c1照怎么办 科三网上预约超过了次数限制怎么办 驾照罚款没交过了周期怎么办 驾照考了科科目一想换个驾校怎么办 韩国货物被机场海关扣了怎么办 车管所查不到居住证信息怎么办 高中毕业两年了想考大学怎么办 我买的二手货车营运证是假的怎么办 移民到欧洲国家想去日本怎么办签证 签证要写工作单位如果没有怎么办 办护照时的身份证过期了怎么办 有摩托车驾照想考小车驾照怎么办