C++ Primer 第8章 IO库 Jeff

C++语言不能直接处理输入输出,而是通过一族定义在标准库中的类型处理IO。这些类型支持设备的IO操作,设备可以是控制台、文件等。IO类可以处理char数据和宽字符类型,也可以处理string类型。

IO库主要基于istream和ostream两个类型进行扩充。istream表示输入流,用于处理向程序的输入数据,ostream表示输出流,用于处理从程序中输出数据。继承自istream和ostream的其他IO类的操作方式与istream和ostream的操作方式相同。

IO对象无拷贝与赋值,因此不能拷贝IO对象,也不能对IO对象赋值,不能将形参和返回类型设置为IO对象,函数只能以引用的方式传递或返回IO对象,但引用类型不能是const类型。

IO对象可能会发生错误,有写错误是可恢复的,有些则发生在系统深处,不可恢复。如int ival; cin>>ival;如果在标准输入上键入Bob,读操作就会失败,cin会进入错误的状态,通过检测流对象的一些标志或函数可以判断流的状态,并可能从错误中恢复。只有当流处于非错误状态时才能进行操作,把流当做一个条件来使用可以简单的实现流状态检测,如:while(cin>>word){};

通过iostate值可以确定流的状态,这些值表示特定的位模式,可以与位运算符一起使用。对每个位的检测都提供了特定的函数,如good(),fail()等,通过good和fail函数可以确定流的状态。

clear可以用来重置标志位,带参数的clear接受一个表示新状态的iostate值,不带参数的clear清除所有错误标志位。rdstate返回流的当前状态,setstate将给定调键位置位,表示发生了错误。

每个输出流都管理一个缓冲区,缓冲区的存在可以提升性能,有了缓冲区,操作系统可以把程序的多个输出组合成单一的设备写操作。导致缓冲刷新的原因有很多,缓冲刷新后才会真正把数据写入到输出设备。程序正常结束时,缓冲区刷新;缓冲区满时,缓冲区将被刷新;使用操纵符endl可以显示刷新缓冲区;使用unitbuf操纵符可使流每次都刷新缓冲区;当读写被关联的流时,关联到的流的缓冲区会被刷新。使用flush和ends操纵符可以刷新缓冲区。cout<<unitbuf设置流每次写入数据后都立即刷新缓冲区,cout<<nounitbuf设置流恢复正常的缓冲策略。

注意,如果程序崩溃,输出缓冲区不会刷新,因此在调试程序时要确保可能崩溃前的缓冲区都被刷新。

当一个输入流被关联到一个输出流时,任何从输入流读取数据的操作都会刷新关联的输出流,默认情况下标准库的cin关联到cout。

可以将一个istream关联到一个ostream,也可以将一个ostream关联到另一个ostream。标准库的cin对象默认关联到cout对象,可以通过tie函数返回关联的输出流的指针,或通过tie带参数的重载版本设置要关联到的输出流。

头文件fstream中定义了三个类型用来支持文件IO,ifstream表示输入流,用来读取文件,ofstream表示输出流,用来写入文件,fstream可以读写给定文件。这些对象提供的操作与cin、cout对象一样,同时还提供与文件管理的其他操作,包括open、close、带mode参数的构造函数等。在创建文件流对象时,可以通过提供文件名来使流对象与特定的文件关联。

可以向基类类型的引用或指针的参数传递派生类,因此可以使用ifstream对象传递给istream&类型的参数。一旦一个文件流已经打开,它会保持与对应文件的关联,如果对已经打开的文件流调用open会失败。若想使文件流关联到另一个文件,需要首先关闭当前文件在打开另一个文件。

当一个fstream对象被销毁时,close会自动被调用。

每个流都有一个关联的文件模式,ofstream只能以out模式打开,ifstream只能以in模式打开,fstream可以以in模式打开也可以以out模式打开。与fstream关联的文件默认以in和out模式打开。

以out模式打开文件会丢弃原有数据,为了保留原有数据,在构造对象时必须显示指定app模式。对于一个文件流,每次打开文件时都可以改变文件模式。

注意,每次打开文件时都会设置文件模式,可能是显示的设置,也可能是隐式的设置,当未指定任何模式时,将使用默认值。

sstream头文件定义三个类型用来定义内存IO,istringstream用来从string读取数据,ostringstream用来向string写入数据。str()函数用来返回保存到流中的string对象,带参数的str对象把参数表示的string拷贝到流中。

可以通过istringstream对象处理字符串,读取字符串时可以通过>>运算符实现,如record>>info.name。通过ostringstream构造字符串,像使用流对象一样向字符串流中输入数据,最后通过str函数获取构造的字符串。

每个io对象都维护一组状态,当对象的状态变为无效时,后续的所有操作都会失败,知道流的错误被纠正,标准库提供一组函数,用来检验和设置这些标志。

原文地址:https://www.cnblogs.com/jefflee/p/6567922.html