【读书笔记:C++ primer plus 第六版 中文版】第17章 输入、输出

转载请注明出处:

本章内容包括:

用于文件输入和输出的C++工具都是基于cin和cout所基于的基本类定义.因此本章以对控制台I/O(键盘和屏幕)的讨论为跳板,来研究文件I/O.

17.1 C++输入和输出概述

C++依赖于C++的I/O解决方案,而不是C语言的I/O解决方案,前者是在头文件iostream(以前为iostream.h)和fstream(以前为fstream.h)中定义一组类.这个类库不是正式语言定义的组成部分(cin和istream不是关键字);

17.1.1 流和缓冲区

C++程序把输入和输出看作字节流.流充当了程序和流源或流目标之间的桥梁.C++程序只是检查字节流,而不需要知道字节来自何方.同理,通过使用流,C++程序处理输出的方式将独立于其去向.因此管理输入包含两步:

17.1.2 流、缓冲区和iostream文件

17.1.3 重定向

这个工具使得能够改变标准输入和标准输出.通过输入重定向(<)和输出重定向(>)换句话说,操作系统改变了输入流的流入端连接,而流出端仍然与程序相连.

17.2 使用cout进行输出 17.2.1 重载的<<运算符

在C++中,与C一样,<<运算符的默认含义是按位左移运算符.但ostream类重新定义了<<运算符,方法是将其重载为输出.在这种情况下,<<叫做插入运算符.1.输出和指针 ostream类还未下面的指针类型定义了插入运算符函数: 方法使用字符串中的终止空字符来确定何时停止显示字符.2.拼接输出 插入运算符的所有化身的返回类型都是ostream&.也就是说,原型的格式如下:ostream & operator<<(type);函数定义指出,引用将指向用于调用该运算符的对象.换句话说,运算符函数的返回值为调用运算符的对象.

17.2.2 其他ostream方法

ostream类还提供了put()方法和write()方法,前者用于显示字符,后者用于显示字符串.一些老式编译器错误地为char,unsigned char和signed char 3种参数类型重载了put().这使得将int参数用于put()时具有二义性,因为int可被转换为这3种类型中的任何一种.程序清单17.1 write.cpp write()方法并不会在遇到空字符时自动停止打印字符,而只是打印制定数目的字符,即使超出了字符串的边界!

17.2.3 刷新输出缓冲区

如果程序使用cout将字节发送给标准输出,情况如何?由于ostream类对cout对象处理的输出进行缓冲,所以输出不会立即发送到目标地址,而是被存储在缓冲区中,知道缓冲区填满.然后,程序将舒心flush缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据.通常,缓冲区为512字节或其整数倍.可以用更为方便的插入表示法来成功的进行刷新.

17.2.4 用cout进行格式化

ostream插入运算符将值转换为文本格式.注意:并非所有的编译器都能生成符合当前C++标准格式的输出.另外,当前标准允许区域性变化.例如,欧洲实现可能遵循欧洲人的风格:使用逗号而不是句点来表示小数点.也就是说,2.54将被写成2,54.区域库(头文件locale)提供了用特定的风格影响imbuing输入或输出流的机制,所以同一个编译器能够提供多个区域选项.本章使用美国格式.程序清单17.2 defaults.cpp 注意,1.200末尾的0没有显示出来,但末尾0的浮点值后面将有6个空格.1.修改显示时使用的计数系统 2.调整字段宽度 3.填充字符 在默认情况下,cout用空格填充字段中未被使用的部分,可以用fill()成员函数来改变填充字符.程序清单17.5 fill.cpp 注意,与字段宽度不同的是,新的填充字符将一直有效,直到更改它为止.4.设置浮点数的显示精度 5.打印末尾的0和小数点 iostream系列类没有提供专门用于完成这项任务的函数,但ios_base类提供了一个setf()函数(用于set标记),能够控制多种格式化特性.程序清单17.7 showpt.cpp6.再谈setf() setf()函数有两个原型. fmtflags setf(fmtflags); 程序清单17.8 setf.cpp 注意,仅当基数为10时才使用加号.C++将十六进制和八进制都视为无符号的,因此对它们,无需使用符号(然而,有些C++实现可能仍然会显示加号).fmtflags setf(fmtflags , fmtflags); 8.头文件iomanip 3个最常用的控制符分别是setprecision(),setfill()和setw(),它们分别用来设置精度,填充字符和字段宽度.程序清单17.10 iomanip.cpp

17.3 使用cin进行输入

cin解释输入的方式取决于value_holder的数据类型.

17.3.1 cin>>如何检查输入

不同版本的抽取运算符查看输入流的方法是相同的.程序清单17.11 check_it.cpp

17.3.2 流状态

1.设置状态 为什么需要重新设置流状态呢?对于程序员来说,最常见的理由是,在输入不匹配或到达文件尾时,需要使用不带参数的clear()重新打开输入.是否有意义,取决于程序要执行的任务.2.I/O和异常

17.3.3 其他istream类方法

1.单字符输入 (1).成员函数get(char &)2.采用哪种单字符输入形式3.字符串输入:getline(),get()和ignore() 程序清单17.13 get_fun.cpp4.意外字符串输入

17.3.4 其他istream方法

程序清单17.14 peeker.cpp程序清单17.15 truncate.cpp

17.4 文件输入和输出 17.4.1 简单的文件I/O

警告:以默认模式打开文件进行输出将自动把文件的长度截短为零,这相当于删除已有的内容.读取文件的要求与写入文件相似: 当输入和输出流对象过期(如程序终止)时,到文件的连接将自动关闭.另外,也可以使用close()方式来显式地关闭到文件的连接.关闭这样的连接并不会删除流,而只是断开流到文件的连接.然而,流管理装置仍被保留.程序清单17.16 fileio.cpp

17.4.2 流状态检查和is_open()

警告:以前,检查文件是否成功打开的常见方式如下:if(fin.fail()) … //failed to openif(!fin.good()) … //failed to openif(!fin) … //failed to openfin对象被用于测试条件中时,如果fin.good()为false,将被转换为false;否则将被转换成true.因此上面三种方式等价.然而,这些测试无法检测到这样一种情形:试图以不适合的文件模块打开文件时失败.方法is_open()能够检测到这种错误以及good()能够检测到的错误.然而,老式C++实现没有is_open();

17.4.3 打开多个文件

在这种情况下,可以打开一个流,并将它依次关联到各个文件.喜欢真实的人,要做真实的人,所以从来不会想要刻意模仿任何人。

【读书笔记:C++ primer plus 第六版 中文版】第17章 输入、输出

相关文章:

你感兴趣的文章:

标签云: