标准IO库 C++学习

1、面向对象的标准库

        实际的程序不仅限于对控制窗口的IO,通常还需要读或写已命名的文件。此外,程序还应该能够方便地使用IO操作格式化内存中的数据,从而避免读写磁盘或其他设备的复杂性和运行代价。应用程序还需要支持宽字符语言的读写。

        从概念上看,无论是设备的类型还是字符的大小,都不影响需要执行的IO操作。要同时支持不同的设备和不同大小的字符流,标准库使用了继承来定义一组面向对象的类。一般而言,通过继承关联起来的类型都共享公共的接口。如果两个类型存在继承关系,则可以说一个类(派生类)“继承”了其父类(基类)的行为——接口。

        IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream定义的类型则用于读写存储在内存中的string对象。在fstream和sstream里定义的每种类型都是从iostream头文件里定义的相关类型派生而来。

        头文件iostream中包含的类型:istream 从流中读取,ostream写入到流中去,iostream对流进行读写,从istream和ostream派生而来。

        头文件fstream中包含的类型:ifstream从文件中读取,由istream派生而来;ofstream写到文件中去,由ostream派生而来;fstream读写文件,由iostream派生而来。

        头文件sstream中包含的类型:istringstream从string对象中读取,由istream派生而来;

                                                               ostringstream写到string对象中去,由ostream派生而来;

                                                               stringstream对string对象进行读写,由iostream派生而来。

        由于ifstream和istringstream类型继承自istream类,故读istream对象的程序也可用于读文件(ifstream)或者string对象(istringstream)。类似地,提供输出功能的程序同样可用于ofstream或ostringstream取代ostream类型实现。除istream和ostream类型之外,iostream头文件还定义了iostream类型。iostream类型继承自istream和ostream。这意味着iostream对象共享了他的两个父类的接口。iostream类型在同一个输入流上实现输入和输出操作。

        对IO类使用继承的另外一个含义:如果函数有基类类型的引用形参时,可以给函数传递其派生类型的对象。这样就可以编写一个函数,而将它应用到三种类型的流上:控制台、磁盘文件或者字符串流。

        IO对象不可以复制或赋值,这个要求有两层含义:1、只有支持复制的元素类型可以存储在vector或者其他容器类型里,因此流对象是不能存储在vector(或其他)容器中的(即不存在存储流对象的vector或者其他容器)。2、形参或返回类型也不能为流类型。如果需要传递或返回IO对象,则必须传递或返回该对象的指针或引用。

       一般情况下,如果要传递IO对象以便对它进行读写,可用非const引用的方式传递这个流对象。对IO对象的读写绘改变它的状态,因此引用必须是非const的。

 

2、条件状态

      IO标准库管理一系列的条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误。

        strm::iostate 机器相关的整型名,由各个iostream类定义,用于定义条件状态。

        strm::badbit  strm::iostate 类型的值,用于指出被破坏的流。

        strm::failbit    strm::iostate 类型的值,用于指出失败的IO操作。

        strm::eofbit    strm::iostate 类型的值,用于指出流已经到达文件结束符。

        s.eof()              如果设置了流s的eofbit的值,则该函数返回true。

        s.fail()              如果设置了流s的failbit的值,则该函数返回true。

        s.bad()            如果设置了流s的badbit的值,则该函数返回true。

        s.good()          如果流s处于有效状态,则该函数返回true。

        s.clear()          将流s中的所有状态都重设为有效状态。

        s.clear(flag)   将流s中的某个特定条件状态设置为有效。flag的类型是strm::iostate。

        s.setstate(flag) 给流s添加指定条件。flag的类型是strm::iostate。

        s.rdstate(flag) 返回流s的当前条件,返回值类型为strm::iostate。

        流必须处于无错误状态,才能用于输入或输出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章