鱼C论坛

 找回密码
 立即注册
查看: 2790|回复: 3

话说关于cin.peek的问题

[复制链接]
发表于 2016-11-18 01:31:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 四十二 于 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,这不会报错吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-18 01:37:50 | 显示全部楼层
虽然帖子内容里并没有体现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才会刷新吗,但是我注释掉之后现象是一样的啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-18 01:43:54 | 显示全部楼层
作者:趙俊傑
链接: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可能会刷新一次?
@小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-18 01:48:12 | 显示全部楼层
看这句:

The endl manipulator produces a newline character, exactly as the insertion of '\n' does;

我又有了新的理解,一般推到输出缓冲区新数据后,系统(也可能是别的什么机制)检测到‘\n’会才刷新推出输出缓冲区的数据?

感觉自己应该是说到点子上了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 15:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表