当前位置: 首页 > 文档资料 > C++大学教程 >

11.10 章节小结

优质
小牛编辑
155浏览
2023-12-01

I/O操作是以对数据类型敏感的方式执行的。
C++的I/O操作是以字节流的形式实现的。流实际上就是字节序列。

输入/输出系统的任务实际上就是以一种稳定、可靠的方式在设备与内存之间传输数据。

C++提供了低级和高级I/O功能。低级I/O功能通常只在设备和内存之间传输一些字节。高级I/O功能把若干个字节组合成有意义的单位,如整数、浮点数、字符、字符串以及用户自定义类型的数据。

C++提供了无格式I/O和格式化I/O两种操作。无格式I/O传输速度快,但使用起来较为麻烦。格式化I/O按不同的类型对数据进行处理,但需要增加额外的处理时间,不适于处理大容量的数据传输。

头文件iostream.h包括了操作所有输入/输出流所需的基本信息,因此在大多数C++程序中都应该包含这个头文件。

在执行格式化I/O时,如果流中带有含参数的流操纵算子,头文件iomanip.h所包含的信息是有用的。

头文件fstream.h包含了文件处理操作所需的信息。

类istream支持流的输入操作。

类ostream支持流的输出操作。

类iostream同时支持流的输入、输出操作。

类istream和ostream是通过单一继承从基类ios派生出来的。

类iostream是通过多重继承从类istream和ostream派生出来的。

重载的左移位运算符(<<)表示流的输出,称为流插入运算符。

重载的右移位运算符(>>)表示流的输入,称为流读取运算符。

cin是类istream的对象,它与标准输人设备(通常指键盘)“连”在一起。

cout是类ostream的对象,它与标准输出设备(通常指显示器)“连”在一起。

cerr是类ostream的对象,它与标准错误输出设备“连”在一起。对象cerr的输出是非缓冲输出,每一条出错信息都 会被立即显示出来。

流操纵算子endl用来插入一个换行符,并同时刷新输出缓冲区。

C++编译器能够自动识别输入、输出数据的类型。

默认情况下,地址是以十六进制格式显示的。

可以将指针强制转换为void*类型从而输出指针变量中的地址。

成员函数put用于输出单个字符,可以连续调用pul函数。

流的输入通过流读取运算符>>实现,该运算符自动跳过输入流中的空白字符。

当遇到输入流中的文件结束符时,运算符>>返回false。

当输入出现格式错误时,流读取运算符就会设置输入流的failbit状态位;如果操作失败则设置badbit状态位。

我们通常在while循环结构的首部用流读取运算符输入一系列值。当遇到文件结束符时,流读取运算符返回0。

不带参数的get函数读取(输入)一个字符,并返回该字符;当遇到输人流中的文件结束符时.返回EOF。

带一个字符型参数的get成员函数输入一个字符。当遇到文件结束符时,函数返回EOF,否则返回对istream对象的引用,并用该引用再次调用get函数。

带有三个参数的get成员函数,其三个参数分别是接收字符的字符数组、字符数组的大小和分隔符(默认值为'\n')。函数或者在读取比指定的最大字符数少一个字符后结束,或者在遇到分隔符时结束。空字符终止输入的字符串。函数不把分隔符放到字符数组中,但是分隔符仍然会保留在输入流中。

成员函数getline与带三个参数的get函数类似。getline要去除输入流中的分隔符,但是不把它存放在字符串中。

成员函数ignore用于在需要时跳过流中指定数量的字符(默认个数是1),或在遇到指定的分隔符(默认分隔符是EOF)时结束。

成员函数putback将最后一次用get从输人流中读取的字符放回到输入流中。

peek成员函数从输入流返回下一个字符,但不从流中删除这个字符。

C++使用的是类型安全的I/O操作。如果>>或<<运算符接收到了非法的数据类型,那么系统将设置各种错误标志位,用户可根据这些标志位来判断操作I/O的成功与失败。

调用成员函数read、write可实现无格式输入/输出。这两个函数分别把一定量的字节输入内存和从内存中输出。这些字节都是未经任何格式化的,仅仅是以原始数据形式输入或输出。

成员函数gcount返回函数read从输入流中读取的字符个数。

成员函数read把指定个数的字符输入到字符数组中。如果读取的字符个数少于指定的数目,就设置标志位failbit。

如下方法可改变流中整数的基数:使用流操纵算子hex可设置十六进制基数(基数为16)、使用流操纵算子oct可设置八进制基数(基数为8)、使用流操纵算子dec可恢复十进制基数。只有显式地改变流的基数,否则流的基数是不变的。

流操纵算子setbase也可以为整数输出设置基数。流操纵算子setbase带有一个整数参数10、8或16。

流操纵算子setprecision或成员函数percision控制浮点数小数点后面的位数。设置了精度以后,该精度对之后所有的输出操作都有效,直到再一次设置精度为止。无参数的成员函数percision返回当前的精度。

使用任伺参数化的流操纵算子都必须在程序中包含头文件iomanip.h。

成员函数width设置当前域宽并返回以前设置的域宽。如果显示数据所需的宽度比设置的域宽小,空位用填充字符填充。域宽设置仅对下一次流读取或流插入操作有效;然后域宽隐式设为0(可以输出任意长度的序列值)。长度大于域宽的值也可以完整输出。不带参数的函数width返回当前域宽。流操纵算子setw也可以用来设置城宽。

在输入操作中,流操纵算子setw用于设置字符串长度的最大值。如果输入子一个长度大于最大值的字符串,那么该字符串将被分为若干个长度不大于限定值的字符串。

用户可以建立自己的流操纵算子。

成员函数setf、unsetf和flags控制标志设置。

skipws标志指示>>跳过输入流中的空白字符。流操纵算子ws还可用于跳过输入流中的前导空白字符。

格式标志在类ios中被定义为枚举值。

虽然成员函数flags、setf和unsetf可以控制格式标志,但是许多程序员更喜欢使用流操纵算子。程序员可以用按位或操作(|)把各种标志选项结合在一个long类型的值中。调用成员函数flags并指定要进行或操作的标志选项就可以在流中设置这些标志,并返回一个包括以前标志选项的long类型的值。返回值通常要保存起来,以便用保存值调用flags来恢复以前的选项。

flags函数必须指定一个代表所有标志设置的值。而带有一个参数的函数setf指定的标志与现存的标志设置进行或操作,形成新的格式状态。

设置showpoint标志是为了强制输出浮点数的小数点和由精度指定的有效数字的个数。

left标志可以使输出域左对齐并把填充字符放在输出数据的右边,riiht标志可以使输出域右对齐并把填充字符放在输出数据的左边。

internal标志指示将一个数的符号位(设置了ios::showbase标志时为基数)在域宽内左对齐,数值右对齐,中间的空白由填充字符填充。

left、right和internal标志包含在ios::adjustfield中。

成员函数fill用于设置与left、right和internal一起使用的使输出域对齐的填充字符;如果没有特别指定,空格即为填充字符。fill函数返回以前设置的填充字符。流操纵算子setfill同样也可设置填充字符。

静态成员ios::basefield包括oct、hex和dec位,这些位分别指定把整数作为八进制、十六进制和十进制值处理。如果没有设置这些位,则流插入运算默认整数为十进制数,流读取运算按提供的方式处理数据。

设置showbase标志可强制输出整数值的基数。

ios::scientific和ios::fixed标志包含在静态数据成员ios::floafield中。这些标志用于控制浮点数的输出格式。设置scientific标志使浮点数按照科学记数法格式输出,设置fixed标志使浮点数按照 precision 成员函数指定的精度输出。

函数调用 cout.setf(O,ios::floatfield)恢复浮点数的默认显示格式。

设置1os::uppercase标志用来使大写的x和E分别同十六进制整数和以科学记效法表示的浮点数一起输出。一旦设置ios::uppercase标志,十六进制数中的所有字母都转换成大写。

无参数的成员函数flags只返回格式标志的当前设置(long类型的值)。带一个long类型参数的成员函数flags按参数指定的格式设置标志并返回以前的标志设置。

成员函数setf设置参数所指定的格式标志,井返回前一次的标志设置值(long类型的值)。成员函数setf(long、setbits、long resetBits)清除resetBits中的位,然后设置resetBit位。

成员函数unsetf清除已设置的标志并返回清除前的标志值。

参数化的流操纵算子setiosflags与成员函数flags执行同样的功能。

参数化的流操纵算予resetiosflags与成员函数unsetf执行同样的功能。

流的状态可以用类ios中的位来检测。

当遇到文件结束符时,输入流中会被自动设置eofbit。可以在程序中用成员函数eof确定是否设置了eofbit。

当流中发生格式错误时虽然会设置failbit,但是字符并未丢失。成虽函数fail判断流操作是否失败,这种错误通常可恢复。

当发生导致数据丢失的流格式错误时,设置badbit。成员函数bad判断流操作是否失败,这种严重错误通常不可修复。

如果函数bad、fail和eof全都返回false,则成员函数good返回true。应该只对“好”的流进行I/O操作。

成员函数rdstate返回流的错误状态。

成员函数clear通常用于把一个流的状态恢复为“好”,从而可以对该流继续执行I/O操作。

为保证输出在下一个输入前显示,C++提供了成员函数如tie,该函数可以实现输入/输出操作的同步。