IO操作需要支持不同类型的设备和不同类型数据的接口。所以IO标准库使用了继承来定义一组面向对象的类。
### 1.首先IO类型在三个头文件中定义
iostream定义控制窗口读写的类型,fstream定义读写已命名文件的类型,sstring定义读写存储在内存中string对象(这个在做ACM的很多题目的时候很方便,这个在后面会提一下)。由于集成关系加上多态的特性(动态绑定)我们可以用istream&即使用istream的一个引用来作为形参,这样既可以使用istream对象做实参,也可以使用ifstream和istringstream对象来做实参,同理ostream&引用类型类似,这里不做复述了。
欢迎访问本人csdn博客:http://blog.csdn.net/IAccepted
### 2. IO对象不可以复制或赋值
原因:之所以不能被复制原因就是IO对象的复制构造函数是私有的。
导致的结果:
1).只有支持复制的元素类型可以存储在vector或其他容器里,由于流对象不能被复制的原因,所以流对象不能存储在容器中。
2).形参或返回类型也不能为流对象。
原因是流类的复制构造函数是私有的,不能被调用,而我们都知道当形参或返回值为对象类型时都要调用对象的复制构造函数进行对象的拷贝。
如果需要传递或返回IO对象,则必须传递或返回只想该对象的指针或引用。
欢迎访问本人csdn博客:http://blog.csdn.net/IAccepted
### 3.输出缓冲区管理
每个IO对象管理一个缓冲区,用于存储程序读写的数据。通常以下几种情况将导致缓冲区的内容被刷新(即写入到真实的输出设备或者文件中)。
1).程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。
2).缓冲区已满,这时缓冲区将会在写入下一个值之前刷新。
3).程序员自己显示刷新,这就依靠特定的操作符,通常用endl。
4).将输出流与输入流关联,这样,在读入时将刷新关联的输出缓冲区。
### 4.文件的输入和输出
早期C语言的原因,IO标准库使用是C语言风格的字符串而不是C++风格的string字符串作为文件名,所以通常我们会讲string类型的字符串通过调用c_str类型转化为C风格字符串进行文件打开。
1).要养成打开文件后文件打开状态检测的好习惯。
2).当用一个流去操作多个文件时一定要清除文件流的状态即调用clear()方法。因为关闭流不能改变流对象的内部状态,如果一次读写操作失败,即使关闭流对象再打开也不能避免上次保持的错误状态,所以一定要调用clear()来清除这种错误状态。
3).文件模式只是文件的属性,而不是流的属性。ofstream::app ofstream::in ofstream::out 等等。
### 5.字符串流
在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