IO类型在三个独立的头文件中定义:iostream定义读写控制窗口类型,fstream定义读写已命名的文件类型,而sstream所定义的类型则用于读写存储在内存中的string对象。
fstream和sstream里定义的每种类型都是从iostream头文件中定义的相关类型派生出来。
sstream istringstream从string对象读取,由istream派生
ostringstream写到string对象中,由ostream派生
stringstream对string对象读写,由iostream派生
IO类型用于三种类型: 控制台、磁盘文件和字符串流。
IO对象不可复制或赋值,不存在存储流对象的vector或其他容器。
形参或返回类型也不能是流类型。必须传递该对象的指针或引用。
一般引用是非const的。
输出缓冲区的刷新
cout<<flush; //刷新缓冲区,不加任何数据
cout<<ends; //缓冲区中插入字符null,刷新缓冲区
cout<<endl; //缓冲区插入换行符,刷新缓冲区
清除文件流状态一个范例:
ifstream input;
vector<string>::const_iterator it = files.begin();
while(it != files.end()){
input.open(it->c_str());
if(!input)
break;
while(input>>s)
process(s);
input.close();
input.clear();
++it;
}
这里的c_str()是将string类型对象转换成C风格的字符串,返回的指针指向const char类型数组。
该程序的clear函数调用必不可少,以这个为范例。
文件模式(模式是文件的属性而不是流的属性)
in 打开文件读操作 |
out 打开文件写操作,相当于out | trunc(打开的文件会被清空) |
app 每次写之前找到文件尾 |
ate 打开文件后立即将文件定位在文件尾(初始定位,第一次) |
trunc 打开文件时清空已存在的文件流 |
binary 二进制进行IO操作(文件以字节序列形式处理) |
out、trunc和app只能用于指定与ofstream或fstream对象相连的文件。
in用于ifstream和fstream。
ate和binary用于所有的。
一个打开并检查输入文件的程序:
ifstream& open_file(ifstream& in, const string & file)
{
in.close();
in.clear();
in.open(file.c_str());
return in;
}