标准io库类型和头文件
iostream 对流进行读写
fstream 对文件进行读写
sstream 对string对象进行读写
一.IO对象不可复制或赋值
eg:
ofstream out1,out2;
out1=out2; // error : cannot assign stream objects
//print functions:parameter is copied
ofstream print(ofstream)
out2=print(out2); // error: cannot copy stream objects
这里要求有两种特别重要的含义,只有支持复制的元素类型可以存储在vector或其他容器类型里,由于流对象不能复制,因此不能存储在vector(或其他)容器中,即不存在存储流对象的vector或其他容器)
第二个含义是:形参或返回类型也不能为流类型,如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用: //ps: 函数的形参为指针时,此时复制的是实参的指针,而不是本身。
ofstream &print(ofstream&); //OK: take a rerferce,no copy;
while(print(out2)) { /* ,...*/} // ok: pass referce to out2
一般情况下,如果要传递IO对象以便对它进行读写,可用非const引用的方式的方式传递这个流对象,对IO对象的读写会改变它的状态,因此引用必须是非const的。
二,流状态的查询和控制
可用管理如下输入操作
int ival;
//read cin and test only for EOF:loop is executed even if there are other IO failures) 读取cin而且仅仅测试是否为eof错误,即使cin错误也是可用执行的
while(cin>>ival,!cin.eof())
{
if(cin.bad())
throw runtime_error(" IO stream corrupted");
if(cin.fail())
{
cerr<<" bad data,try again":
cin.clear(istream::failbit);
continue;
}
// ok to process ival;
}
这个循环不断读入cin,直到到达文件结束符或者发生不可恢复的读取错误为止,循环条件使用了逗号操作符,首先计算它的每一个操作数,然后返回最右边操作数作为整个操作的结果,因此,循环条件只读入cin而忽略了其结果,该条件的结果是!cin.eof()的值,如果cin到达了文件的结束符,条件则为假,退出循环,否则不管怎样将进入循环。
在循环中,先检查流是否被损坏,如果是的话,抛出异常并退出循环,如果输入无效,则输出警告并清除failbit状态,在本例中,执行continue语句回到while的开头,读入另一个值给ival,如果没有出现任何错误,那么循环体余下的部分即可正常的使用ival。
三。缓冲区的管理