返回信息流istream_iterator<string> in_iter(cin),eof;
ostream_iterator<string> out_iter(cout,"\n");
vector<string> vec;
while(in_iter!=eof)
{
vec.push_back(*in_iter);
*out_iter++=*in_iter++;
}
问题是输入hello world 两个字符串后,打印出来的只用hello,然后设断点观察,发现while第二次执行内部程序是执行到*out_iter++=*in_iter++;就会直接跳到输入,无法输出。理想状况是先打印完了再判断迭代器是否是eof不是的话才会跳到输入。奇怪的为什么第二次不能执行输出?
刚开始学习,请前辈指点!谢谢!
这是一条镜像帖。来源:北邮人论坛 / cpp / #89602同步于 2015/12/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++ istream_iterator问题【求前辈指教】
yeah11
2015/12/1镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
*out_iter++=*in_iter++;
改成
*out_iter++=*in_iter;
in_iter++;
in_iter++在operator++函数中会企图读下一个字符,因此还没来得及把当前的元素送给out,就阻塞了
这一点和普通指针的*p++操作的执行顺序可能不同
或者循环这样写:
do{
*out_iter++=*in_iter;
}while(++in_iter != eof);
你的意思我懂了,解决的方法也可行。我自己又跟踪进入底层的函数中,重载++中确实在返回this值之前进入了另一个类重载++中,确实如你所说,当时调试的时候没去看重载++。谢谢!因为这是c++primer那本书上的代码,是不是编译器的底层的文件不断完善的,才导致这样的错误现象?!
【 在 inaadversity 的大作中提到: 】
: *out_iter++=*in_iter++;
: 改成
: *out_iter++=*in_iter;
: ...................
能不能最后输入一个EOF试试?Windows下是ctrl+z,Unix是ctrl+d。
istream_iterator的++运算符会调用下面的istream的>>运算符,但是一旦遇到EOF应该就停了,不会继续阻塞了。
其实这并不是错误现象,如果你的输入中包含EOF,还是可以实现功能的。linux下输入ctrl-d,windows下输入ctrl-z+回车。
不过了解一下底层函数还是很有用的
【 在 yeah11 的大作中提到: 】
: 你的意思我懂了,解决的方法也可行。我自己又跟踪进入底层的函数中,重载++中确实在返回this值之前进入了另一个类重载++中,确实如你所说,当时调试的时候没去看重载++。谢谢!因为这是c++primer那本书上的代码,是不是编译器的底层的文件不断完善的,才导致这样的错误现象?!
:
我输入yes no hello world 以ctrl+Z结束,输出是yes no hello,我接着输入ctrl+z后,输出是world →然后程序结束了,对,是结束程序的运行,不是接着然继续输入。但是关于我问的那一点还是在于重载++这儿。不过这个效果也是很好的。谢谢指点!
【 在 nuanyangyang 的大作中提到: 】
: 能不能最后输入一个EOF试试?Windows下是ctrl+z,Unix是ctrl+d。
: istream_iterator的++运算符会调用下面的istream的>>运算符,但是一旦遇到EOF应该就停了,不会继续阻塞了。
恩,我明白了,谢谢!以前总以为cin输入后enter键就结束了,后面我才知道cin是忽略空格和换行的。哎!感觉学C++的路还很长,那个底层函数有点坑,一层套着一层,看着真头疼。哈哈哈……
【 在 inaadversity 的大作中提到: 】
: 其实这并不是错误现象,如果你的输入中包含EOF,还是可以实现功能的。linux下输入ctrl-d,windows下输入ctrl-z+回车。
: 不过了解一下底层函数还是很有用的
:
【 在 yeah11 的大作中提到: 】
: 恩,我明白了,谢谢!以前总以为cin输入后enter键就结束了,后面我才知道cin是忽略空格和换行的。哎!感觉学C++的路还很长,那个底层函数有点坑,一层套着一层,看着真头疼。哈哈哈……
:
其实我觉得这个iterator设计的目的是让你从istream_iterator往另一个iterator(比如vector)里拷贝东西,或者从别的iterator(比如vector的)里往ostream_iterator里拷贝东西。C++自带了std::copy函数。比如这里的例子: http://www.cplusplus.com/reference/iterator/ostream_iterator/
我倒是觉得交互使用的话,或者要更精确地控制的话,istream_iterator不如直接用istream好用。