原创 【博客大赛】《C++ Primer》学习笔记(25)IO库

2016-3-25 00:44 1460 11 12 分类: MCU/ 嵌入式 文集: Qt和Cpp
现在,《C++ Primer》的第一部分“The Basics”已经学习完毕。
可以进入第二部分的学习啦!

不同的IO操作之间的一致性,是通过继承来实现的。
ifstream和istringstream继承自istream,getline函数和>>、<<操作符都可以用。

IO对象不可复制,不可赋值,因此它们也不能作为参数或返回值。
要使用它们实现参数或返回值的功能的话,就使用引用。
对IO对象进行读写会改变它们的状态,因此也不能把它们设置为const。

对IO对象的操作天生容易出错,因此IO类提供了函数和标志位,可以访问和操作stream的状态:
strm::iostate
strm::badbit
strm::failbit
strm::eofbit
strm::goodbit
s.eof()
s.fail()
s.bad()
s.good()
s.clear()
s.clear(flags)
s.setstate(flags)
s.rdstate()

如果在期望输入一个int时输入了一个无意义的字符串,或者输入END-OF-FILE,cin都会出错。
一个输入出错之后,其他跟随的输入也会fail。
只有在非错误状态下,stream才能被读写,因此通常在使用它时要测试它的状态:
while (cin >> word)

strm::iostate是标志位的综合,它的某些位代表了特殊的含义,比如:
strm::badbit,系统级的失败,比如不可恢复的读写错误,通常它置位之后stream无法再操作。
strm::failbit,可恢复的错误,比如想读取数字的时候读到了字符,一般可以继续使用。
strm::goodbit,当它为0的时候,意味着没有发生任何错误。
实际使用的时候,调用good()或者bad()函数来获取状态。

----------------
Managing the Output Buffer
一般来说,输出不会立刻刷新,而是会等待几条再一起print,这样节省对设备的操作时间。
什么时候会刷新呢?
 • 程序正常结束,输出缓冲会被刷新。
 • 缓冲区满了。
 • 使用manipulator,比如endl显式的刷新。
 • 使用unitbuf manipulator,比如cerr就使用了它,每次写入每次刷新。
 • 将outstream绑定到其他stream,比如将cout绑定到cin和cerr上,执行cin或cerr即可。

除了endl之外,我们还可以使用另外两个刷新的manipulator:
cout << "Hi." << flush;
cout << "Hi." << ends;
flush会刷新但不会增加某尾的换行符;
ends会刷新而且会增加一个'\0'符号。

如何使用unitbuf?
cout << unitbuf;
cout << nounitbuf;

如果程序崩溃的话,输出缓冲是不会被刷新的。
因此如果我们想确保某条信息一定会被打印,就要使用立即刷新的方式。

IO库将cout绑定到了cin上,因此只要执行cin,cout一定会被刷新:
cin >> ival;
一般来说,交互式的系统都会将cin绑定到cout上,这样等待cin的时候,会提前将prompts刷新。
tie有两种可重载的函数:
第一种是没有参数的函数,它返回指向被tie的那个output stream的指针;
第二种是含有参数的函数,它将被tie的作为指针,tie在自身上,比如
cin.tie(&cout);  //将cout绑定到cin上

每个stream只能tie到最多一个stream上。
多个streams可以tie到同一个stream上。

----------------
File Input and Output
文件IO继承了前面的标准IO,同时添加了自己独特的内容:
fstream fstrm;          //创建一个文件流
fstream fstrm(s);       //创建一个名称为s的文件流
fstream fstrm(s, mode); //创建一个名称为s、模式为mode的文件流
fstrm open(s);          //打开文件s,并绑定到fstrm流上
fstrm.open(s, mode);    //以模式mode打开文件s,并绑定到fstrm流上
fstrm.close();          //关闭fstrm绑定的文件
fstrm.is_open();        //检查现在绑定在fstrm上的文件是否正常打开

创建一个文件流,打开或不打开文件:
ifstream in(ifile);
ofstream out;

当stream对象退出自己的作用域时,文件也会自动关闭。
文件的mode有下面这几种:
in      //打开作为输入,仅用做ifstream或fstream
out     //打开作为输出,仅用做ofstream或fstream
app     //每次写都寻找末尾
ate     //打开就寻找末尾
trunc   //截短文件truncate,仅用做out
binary  //使用二进制来操作文件

输入流是指将文件的内容读到程序中,输出流是指将程序的内容写入文件。
由于打开的时候写在文件头上,因此它本来的内容会丢失。
要避免这种情况,需要显式的指定app mode,文件的mode在每次打开时确定。

----------------
string streams
string streams的声明在文件sstream中,它定义了三种数据类型。
string streams将string当作in-memory的文件。

istringstream读取一个字符串,ostringstream写入一个字符串,
stringstream读取或写入一个字符串。

sstream strm;     //一个未绑定的stringstream
sstream strm(s);  //strm持有一个string s,这个构造函数是explicit
strm.str();       //返回一个string的copy
strm.str(s);      //将string复制进strm,返回void

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户795961 2016-3-25 08:29

加油!
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
EE直播间
更多
我要评论
1
11
关闭 站长推荐上一条 /3 下一条