《C++ Primer》读书笔记—第八章 IO库
声明:
- 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
- 学习一门程序设计语言最好的方法就是练习编程
一、IO类
1、三个头文件定义IO类型:iostream定义用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义类读写内存string对象的类型。
2、为了支持宽字符的语言,标准库定义了一组类型和对象来操作wchar_t类型的数据。名字以一个w开始。宽字符版本的类型和对象与其对应的普通char版本的定义在同一个头文件中。
3、一个流一旦出错,其后的IO操作都会失败。因此代码通常应该在使用一个流之前检测它是否处于良好状态。确定一个流的状态最简单的方式是把它当做一个条件来使用。
while(cin>>word)
//OK ,读操作成功
4、IO库定义一个与机器无关的iostate类型,提供了表达流状态的完整功能。结合位集合来使用。
badbit表示系统级错误,如不可恢复的读写错误。流无法继续使用。
发生可恢复错误,failbit被置位,可修改。流可以继续使用。
如果到达文件尾,则badbit和failbit都会置位。
goodbit的值为0,表示流未发生错误。
如果badbit、failbit、eofbit任一个被置位,则检测流状态的条件失败。
5、IO作为形参或者返回类型时,由于读写会改变IO的状态,所以不能是const类型。也不能对IO进行拷贝。
6、四个流状态函数:
- s.rdstate() 返回流的当前状态,类型为iostate
- s.setstate(flags) 设置流的状态,flags的类型为iostate
- s.clear(flags) 将给定位的状态复位,flags的类型为iostate
- s.clear() 复位所有
7、每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作很耗时,允许操作系统将多个输出操作组合为单一的设备写操作带来性能提升。
8、导致缓冲刷新(即数据真正写到输出设备或文件中)的原因很多:
- 程序正常结束
- 缓冲区满
- 可以使用操作符endl显式地刷新缓冲区
- 每个输出操作之后,可以使用操作符unitbuf设置流的内部状态,清空缓冲区。
- 一个输出流可能被关联到另一个流。当读写被关联的流时,关联到的流的缓冲区会被刷新。
9、endl完成换行并刷新缓冲区的工作;flush刷新缓冲区,但不输出任何额外的字符;ends向缓冲区插入一个空字符,然后刷新缓冲区。
10、unibuf操作符:每次输出操作后都刷新缓冲区。每次写操作后都进行一次flush操作。nounitbuf操作符则重置流,使其恢复正常的系统管理的缓冲区刷新机制。
11、如果程序异常终止,则输出缓冲区是不会被刷新的。调试一个已经崩溃的程序时,需要确认你认为已经输出的数据确实已经刷新了。
二、文件输入输出
1、头文件fstream定义三个类型支持文件IO:ifstream从一个文件中读取数据,ofstream想一个指定文件写入数据,fstream可以读写给指定文件。
2、
1 fstream fstrm; //fstream是某个具体的文件IO类 2 fstream fstrm(s); //指定s时,open函数被自动调用 3 fstream fstrm(s, mode);//按指定的mode打开文件 4 fstrm.open(s);//打开名为s的文件,与fstrm绑定 5 fstrm.close();//关闭与fstrm绑定的文件 6 fstrm.is_open();//返回一个bool值,指出与fstrm关联的文件是否成功打开且未关闭
3、可以用流的状态作为条件,检查文件是否打开成功。必须先关闭已经关联的文件,才可以打开新的文件。
4、当一个fstream对象被销毁时,close会自动被调用。
5、保留被ofstream打开的文件中已有数据的唯一方法是显式地指定app或者in模式。
6、默认情况下,即使不设置trunc,以out模式打开的文件也会被截断,文件原有的内容被清空。
7、不能对输入流设置out模式,也不能对输出流设置in模式。
三、string流
1、SStream头文件定义三个类型:istringstream从string中读数据,ostringstream向string中写入数据,stringstream既可以从string读也可以写数据。
2、当某些工作是对整行的文本进行处理,而其他一些工作是处理行内某个单词,通常用istringstream。
3、当我们逐步构造输出,希望最后一起打印时,ostringstream有用。
4、书中的电话号码读写程序没有完全理解。待到用到时再回来看之。
3.7晚:基地班居然通知要开会了,真是,一学期都没开过会,从来没组织没纪律的基地班居然要开会了。也不管别人有没有课,就直接通知了。真是MDZZ。开会有个卵用,根本没有人用心做他的项目,也没人对他的互联网+ 比赛有兴趣。真不知道能闹出什么笑话,坐等,哈哈哈。
3.8早:没去开会,果然没什么事,百万先生就是要放屁脱裤子。真是笑死。
3.9早:第八章结束。以后的章节应该加了难度,认真,坚持。且随疾风前行。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步