IO类
标准库类型和头文件
Header |
Type |
iostream |
istream wistream从流中读取 |
fstream |
ifstream wifstream从文件中读取;由 istream 派生而来 |
sstream |
istringstream wistringstream从 string 对象中读取;由 istream 派生而来 |
为了支持使用宽字符的语言,标准库定义了一组类型和对象来操纵wchar_t类型的数据。宽字符版本的类型和函数的名字以w开始。宽字符版本的类型和对象与其对应的普通char版本的类型定义在同一个头文件中。
IO类型间的关系
由于 ifstream 和 istringstream 类型继承了 istream 类,因此读 istream 对象的程序也可用于读文件(使用 ifstream 类型)或者 string 对象(使用 istringstream 类型)。类似地,提供输出功能的程序同样可用 ofstream 或 ostringstream 取代ostream 类型实现。
除了 istream 和 ostream 类型之外,iostream 头文件还定义了 iostream 类型。iostream 类型由 istream 和 ostream 两者派生而来。这意味着 iostream 对象共享了它的两个父类的接口。也就是说,可使用 iostream 类型在同一个流上实现输入和输出操作。标准库还定义了另外两个继承 iostream 的类型。这些类型可用于读写文件或 string 对象。
对 IO 类型使用继承还有另外一个重要的含义:如果函数有基类类型的引用形参时,可以给函数传递其派生类型的对象。这就意味着:对 istream& 进行操作的函数,也可使用 ifstream 或者istringstream 对象来调用。类似地,形参为 ostream& 类型的函数也可用ofstream 或者 ostringstream 对象调用。因为 IO 类型通过继承关联,所以可以只编写一个函数,而将它应用到三种类型的流上:控制台、磁盘文件或者字符串流(string streams)。
IO 对象不可复制或赋值
ofstream out1, out2;
out1 = out2; // 错误,不能对流对象赋值
ofstream print(ofstream);//错误,不能初始化ofstream参数
out2 = print(out2); // 错误,不能拷贝流对象
形参或返回类型也不能为流类型。如果需要传递或返回 IO对象,则必须传递或返回指向该对象的指针或引用:
ofstream &print(ofstream&); // ok: takes a reference,no copy
while (print(out2)) { /* ... */ } // ok: pass reference to out2
一般情况下,如果要传递 IO 对象以便对它进行读写,可用非 const 引用的方式传递这个流对象。对 IO 对象的读写会改变它的状态,因此引用必须是非const 的。