IO操作需要支持不同类型的设备和不同类型数据的接口。所以IO标准库使用了继承来定义一组面向对象的类。
iostream定义控制窗口读写的类型,fstream定义读写已命名文件的类型,sstring定义读写存储在内存中string对象(这个在做ACM的很多题目的时候很方便,这个在后面 会提一下)。由于集成关系加上多态的特性(动态绑定)我们可以用istream&即使用istream的一个引用来作为形参,这样既可以使用istream对象做实参,也可以使用 ifstream和istringstream对象来做实参,同理ostream&引用类型类似,这里不做复述了。
欢迎访问本人csdn博客:http://blog.csdn.net/IAccepted
原因:之所以不能被复制原因就是IO对象的复制构造函数是私有的。
导致的结果:
1).只有支持复制的元素类型可以存储在vector或其他容器里,由于流对象不能被复制的原因,所以流对象不能存储在容器中。
2).形参或返回类型也不能为流对象。
原因是流类的复制构造函数是私有的,不能被调用,而我们都知道当形参或返回值为对象类型时都要调用对象的复制构造函数进行对象的拷贝。
如果需要传递或返回IO对象,则必须传递或返回只想该对象的指针或引用。
欢迎访问本人csdn博客:http://blog.csdn.net/IAccepted
早期C语言的原因,IO标准库使用是C语言风格的字符串而不是C++风格的string字符串作为文件名,所以通常我们会讲string类型的字符串通过调用c_str类型转化为C风格字符串进行文件打开。
1).要养成打开文件后文件打开状态检测的好习惯。
2).当用一个流去操作多个文件时一定要清除文件流的状态即调用clear()方法。因为关闭流不能改变流对象的内部状态,如果一次读写操作失败,即使关闭流对象再打开也不能避免上次保持的错误状态,所以一定要调用clear()来清除这种错误状态。
3).文件模式只是文件的属性,而不是流的属性。ofstream::app ofstream::in ofstream::out 等等。
在ACM中有些题目是整行读入一个句子然后逐个单词进行处理,这个时候字符串流就会使得操作相当的简单。
例如杭电OJ2072,代码如下,使用了istringstream后就很方便。
#include <iostream> #include <set> #include <sstream> #include<string.h> using namespace std; int main() { string ss; while(getline(cin,ss) && ss!="#") { istringstream stream(ss); set<string> s; //放在这里,每次都是新容器 string word; while(stream >>word) { s.insert(word); } cout<<s.size()<<endl; } return 0; }
欢迎访问本人csdn博客:http://blog.csdn.net/IAccepted