iostream类型:
- 不能拷贝或赋值。(只能以引用方式传递流)
- 读写会改变对象状态。(引用不能为const)
- 必须在使用之前检查对象的状态
- 迭代器将流作为特定元素的序列
- 可以为任何定义>>/<<的类型T创建输入/输出类型
istream(输入流类型)
istream对象
cin:从标准输入读取数据从istream对象读取数据
“>>”
string word;
//检测流的情况:流有效(没有文件结束标记/非法输入)
while(cin>>word)
cout<<word<<endl;
getline函数:
- 能够保留输入的空白符
- 遇到换行符停止
- 可以将getline的结果作为循环的判断条件
string s;
getline(cin,s);
派生类
ifsream:从文件读取数据istream_iterator
- 支持的操作:
- ==/!=
- 前置/后置递增
- 解引用
- in->mem/(*in).mem0
- 标准库保证在解引用之前读取数据(并不保证立即读取)
- 初始化
- 支持的操作:
//in从输入流is读取类型为T的值
istream_iterator<T> in(is);
//定义为空的迭代器,可以作为尾后迭代器
istream_iterator<T> end;
例如
ifsream in("hello");
//通过str_it读取字符串
istream_iterator<string> str_it(in);
istream_iterator<int> in_iter(cin),eof;
while(in_iter!=eof)
//解运算符之后递增迭代器
vec.push_back(*in_iter++);
//或者
vecotr<int> vec(in_iter,eof);
ostream(输出流类型)
ostream对象
cout:向标准输出写入数据
cerr:将程序错误信息写入标准错误向ostream对象写入数据
“<<”派生类
ofstream:向文件写入数据每个对象都管理1个缓存区,用于保存程序读写的数据。
缓存刷新(数据写到输出设备或文件)CP281
- 程序正常结束时执行return(注意当程序异常终止时不会刷新,调试时需要确认数据是否停留在缓存区)
- 缓存区满
- endl
- 读写被关联的流时(默认时cin和cerr被关联到cout)
ostream_iterator
- 支持的操作:
- out=val;//将val写入out(val和out的类型必须兼容)
- 前置/后置递增(实际编译器不会做任何事情)
- 解引用(实际编译器不会做任何事情)
- 标准库保证在解引用之前读取数据(并不保证立即读取)
- 初始化
- 支持的操作:
//out将类型为T的值写到输出流os
ostream_iterator<T> out(os);
//每个值后面都额外输出空字符结尾的指针
ostream_iterator<T> out(os,d);
ostream_iterator<int> out_iter(cout," ");
for(auto e:vec)
//为了方便阅读和修改
*out_iter++=e;
//实际等于out_iter=e;
//也可以
copy(vec.begin(),vec>end(),out_iter);
cout<<endl;