C++IO对象不可复制或赋值

IO类型的3个独立的头文件:

iostream定义读写控制窗口的类型,

fstream 定义读写已命名文件的类型, (包含fstream类)

sstream定义读写存储在内存中的string对象。(包含了stringstream类)

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的。

练习:

1)ostream print(ostream os);

 这个声明是错的:首先,IO对象是不能复制的,要传递或返回IO对象时,必须传递或返回指向该对象的指针或引用。

  应该改成:   ostream &print(ostream& os);

2) 假设os是一个ofstream对象,下面程序做了什么?

os<<”Goodbye”<


#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”的文件。

            此代码能正常运行,但是看不到有何运行结果。

来源: http://www.cnblogs.com/cofftech/articles/2173111.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐