iostream输入输出流互相绑定问题
来源:互联网 发布:黑道圣徒3御姐捏脸数据 编辑:程序博客网 时间:2024/04/29 15:17
先看如下代码
int main(int argc, char const *argv[]){std::ostream_iterator<std::string> out_iter(std::cout, "\n");std::istream_iterator<std::string> in_iter(std::cin), eof;while (in_iter != eof){*out_iter++ = *in_iter++;}}
当输入a空格符b空格符c空格符d空格符e
输出的是:
a
b
c
d
当依次输入a、b、c、d、e的时候,
结果仍然是:
a
b
c
d
原因如下:
*out_iter++ = *in_iter++;
这句的问题。
你要知道每次的读取动作发生在什么时候。
第一次 判断 in_iter != eof 时读取了 "a" ,然后在
*out_iter++ = *in_iter++;
这句完成了两件事,一是把 "a" 写到 out_iter,二是在 in_iter++ 的时候将 "b" 读入。
再次判断 in_iter != eof 时因为此时 in_iter 已经指向 "b" 了,所以不用再次读入;然后再执行到
*out_iter++ = *in_iter++;
这句把 "b" 输出到 out_iter 同时由 in_iter++ 的操作将 "c" 读入。
...
然后当 in_iter 指向 "e" 而再次执行到
*out_iter++ = *in_iter++;
这句的时候,因为将 "e" 传给 out_iter 和 in_iter++ (读入下一个字符串)这两个操作在同一个表达式中完成,所以只有输入下一个字符串后此表达式才能顺利完成动作,而此时由于正等待新的输入,所以运行实际上停在
*out_iter++ = *in_iter++; 这句话上了,也就看不到将 "f" 传给 out_iter 的执行结果。
要想看到所要的结果,只需将
*out_iter++ = *in_iter++;
这句拆成两句,明确执行顺序即可:
*out_iter++ = *in_iter;
in_iter++;
这样明确先输出再读入,就不会出现上面的情况。
实际在处理文件时由于能够判断文件结尾,不存在等待
*out_iter++ = *in_iter++;
这句执行完的情况,所以 "e" 是可以正常输出的,上面的问题只会出现在命令行输入的情况下。
- iostream输入输出流互相绑定问题
- Java输入输出流-IOStream
- iostream输入输出流与缓冲区
- iostream/fstream中的输入输出流指针的绑定,tie函数的使用。
- C++ iostream 输入输出流格式控制
- C++:输入输出iostream
- C++中的iostream输入输出
- iostream迭代器(输入输出流迭代器)
- Boost.Interprocess使用手册翻译之十:直接输入输出流(iostream)格式化:vectorstream 和bufferstream
- Boost.Interprocess使用手册翻译之十:直接输入输出流(iostream)格式化:vectorstream 和bufferstream
- C++中的IOStream输入输出控制符
- 输入输出流的问题
- iostream中文问题
- iostream.h找不到问题
- HDOJ1720|再谈IO库:iostream的格式化输入输出
- (1)iostream流
- 输入输出问题
- 输入输出问题
- jquery:serilize使用方法
- quick-x 状态机模式
- Android长按Power键弹出关机Dialog框GlobalActions解析
- Oracle全文检索步骤
- Two Sum
- iostream输入输出流互相绑定问题
- Java中equals()与hashCode()的原理与设计
- iso 获得UIColor中RGB各个元素的值
- 男孩应该具备的十个品质
- Spring4.x+Hibernate4.x整合
- ORA-04031
- Oracle中SQL语句学习五(统计分组语句group by和having)
- ural Binary Lexicographic Sequence (dp + dfs)
- 看操作系统虚拟化原理总结篇——基于软件的完全虚拟化——cpu