标准IO库 IO对象不可复制或赋值

转载自 fangyuanhust
最终编辑 fangyuanhust
转载

IO类型的3个独立的头文件:
iostream定义读写控制窗口的类型,
fstream 定义读写已命名文件的类型,             (包含fstream类)
sstream定义读写存储在内存中的string对象。(包含了stringstream类)

iostream 派生出 fstream 和 sstream。   

头文件                 派生类   (基类)
fstream -- ifstream(istream )   ofstream (ostream ) fstream(iostream)
iostream -- istream ostream iostream(istream 和ostream )
sstream -- istringstream (istream )   ostringstream(ostream )    stringstream(iostream)

IO类型使用继承的另一个好处,如果函数有基类类型的引用形参时,可以给函数传递其派生类型的对象。
例如,istream&进行操作的函数,可以使用 ifstream 和 istringstream对象来调用。
因为IO类型采用继承关联,所以可以只编写一个函数,而将它应用到3种类型的流上:控制台、磁盘文件、字符串流。

IO类型不可复制或赋值
因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)
ofstream out1,out2;
out2 = out1; //error : cannot assign stream objects
ofstream print(ofstream);
out2 = print(out2); //error:cannot copy stream objects

形参或返回类型也不能为流类型。如果要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。
ofstream &print(ofstream&); //ok:takes a reference,no copy
while(print(out2)) { ... }          // ok:pass reference to out2
一般,如果要传递IO对象以便对它进行读写,可用非const引用的方式传递这个流对象。对IO对象的读写会改变它的状态,因此引用必须是非const的。


至此,讨论的都是char类型组成的流,标准库还支持wchar_t(宽字符)类型。    在每个类前加个w即可,如wfstream、wstringstream等等。
基于流的wchar_t类型的类和对象在iostream中定义,宽字符文件流类型在fstream中定义,而宽字符stringstream则在sstream头文件中定义。

练习:

1)ostream print(ostream os);
     这个声明是错的:首先,IO对象是不能复制的,要传递或返回IO对象时,必须传递或返回指向该对象的指针或引用。
      应该改成:   ostream &print(ostream& os);

2) 假设os是一个ofstream对象,下面程序做了什么?
os<<"Goodbye"<<endl;
    
    以下是我试着写的代码:
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;

ifstream in("input.txt");
ofstream out("output.txt");

int main()
{
string str = "hi in";
out<<str<<endl;
return 0;
}


首先, out<<----------输出
   in>> ----------输入
case 1:   os --- ofstream
   正常输出
case 2:   os --- ifstream
   << 不对,
   也不能写入 endl;
   应该改成: string str; os>>str;
case 3:   os --- ostringstream -----------这个不是针对文件流的,而是通过写入内存,所以不会在默认目录中自动生成一个名字为“output.txt”的文件。
                此代码能正常运行,但是看不到有何运行结果。

原文地址:https://www.cnblogs.com/yixiaoyang/p/2122731.html