IO类型的3个独立的头文件:
iostream定义读写控制窗口的类型,
fstream 定义读写已命名文件的类型, (包含fstream类)
sstream定义读写存储在内存中的string对象。(包含了stringstream类)
IO类型不可复制或赋值
因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)
在编写程序时,有时会遇到下面所示的一个问题,贴出来,希望对大家有所帮助。
例如:
#include <iostream>
#include <fstream>
using namespace std;
void fun(ofstream ofile)
{
ofile<<"opq rst"<<endl;
}
int main()
{
ofstream outfile;
outfile.open("1.txt", ios::app);
outfile<<"abcdefg hijklmn"<<endl;
fun(outfile);
outfile.close();
return 0;
}
对于这段程序我们会发现,编译是没有问题的,但是运行时会出现“应用程序错误,该内存不能为read”的错误提示。当我们把函数void fun(ofstream ofile)改为void fun(ofstream &ofile)。即我们传递一个指向ofstream对象outfile的引用过去后,发现错误解决了。
这种错误一般是由于访问了不该访问的内存而导致的,并且通常都是在使用指针时才会出现。但是,在这个地方究竟是怎么回事呢?经过查阅资料发现,是由于在C++中,IO对象不可复制或赋值所导致的。
IO类型的3个独立的头文件:
iostream定义读写控制窗口的类型
fstream 定义读写已命名文件的类型
sstream定义读写存储在内存中的string对象
因此,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的。