话说关于cin.peek的问题
本帖最后由 四十二 于 2016-11-18 01:31 编辑#if 1
using namespace std;
int main()
{
char p;
cout << "pls input" ;
while (cin>>p)
{
//p = cin.get(); //由这一行的现象引发了这个帖子
cout << p;
cout << sizeof(p);
}
//cout << endl; //这一行注释掉或者不注释掉没区别?
return 0;
}
#endif // 1
例子很简单,我就一个问题,比如输入aaaa再回车,输出的就是a1a1a1a1,那么问题来了,为什么不是我输入一个a返回一个a1而是输入aaaa再返回a1a1a1a1?
可能我还是没说明白,p是char型,我输入的是aaaa,这不会报错吗? 虽然帖子内容里并没有体现cin.peek,不过这是按照#if 1
using namespace std;
int main()
{
char p;
cout << "pls in" ;
while (cin.peek>>p!='\n')
{
p = cin.get();
cout << p;
//cout << sizeof(p);
}
//cout << endl;
return 0;
}
#endif // 1这里改过来的,就是不明白这个输出流是什么时候刷新,必须要有endl才会刷新吗,但是我注释掉之后现象是一样的啊。 作者:趙俊傑
链接:https://www.zhihu.com/question/20272310/answer/71424132
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
The endl manipulator produces a newline character, exactly as the insertion of '\n' does; but it also has an additional behavior: the stream's buffer (if any) is flushed, which means that the output is requested to be physically written to the device, if it wasn't already. This affects mainly fully buffered streams, and cout is (generally) not a fully buffered stream. Still, it is generally a good idea to use endl only when flushing the stream would be a feature and '\n' when it would not. Bear in mind that a flushing operation incurs a certain overhead, and on some devices it may produce a delay.
----来自http://www.cplusplus.com/doc/tutorial/basic_io/
有关于 endl 文章说的很清楚,有两个作用:1.换行 2.刷新缓存区
一般 输出的话,有两种情况:1.刷新缓存区 2.缓存区满的时候
但是一般情况下,不加endl大多数情况下,也能正常输出,是因为在系统较为空闲时候,会查看缓存区的内容,如果发现新的内容,便进行输出。但是 你并不清楚,系统什么时候输出,什么时候不输出,与系统自身的运行状况有关。而刷新缓存区,是强制性的,绝对性的输出。不取决于系统运行状况
打一个很形象的比喻,
endl 相当于 一个 “要求” -- 你不得不做 (现在,立刻做)
不加 endl 的情况,相当于 一个 “建议” -- 你有空做下(你并不清楚,什么时候做,做没做)
以上是我搜到的,结合我这个问题是不是可以理解成:一般经过一个循环之后cout可能会刷新一次?
@小甲鱼 看这句:
The endl manipulator produces a newline character, exactly as the insertion of '\n' does;
我又有了新的理解,一般推到输出缓冲区新数据后,系统(也可能是别的什么机制)检测到‘\n’会才刷新推出输出缓冲区的数据?
感觉自己应该是说到点子上了。
页:
[1]