window如何判断cin输入流的结束?

发布于 2022-09-03 09:11:30 字数 1193 浏览 19 评论 0

使用while(cin>>str)进行输入的时候,系统是如何判断输入流的结束的?
1554409779-5791d20c2234b_articlex
搜索一番之后,大多数的答案都说系统不会读取ctrl+z,但那个白框框是什么?window读取缓冲区数据的时候,应该是一边读取一边检测的吧?
还有下面这个
2784528627-5791d345373be_articlex
为什么第二个无法输入?读取完缓冲区的数据,为什么那些数据还在?endl不是会刷新缓冲区吗?
下面是源代码.谢谢大家了.

#include <iostream>
#include <string>
using namespace std;

int main(){
    string p1, p2;

    while (cin >> p1){
        p2 += p1;
    }
    cout << p2 << endl;

    return 0;
}



#include <iostream>
#include <string>
using namespace std;

int main(){
    string p1, p2;
    
    cout << "first" << endl;
    while (cin >> p1){
        p2 += p1;
    }
    cout << p2 << endl;
    
    cout << '\n' <<"second" <<endl;
    while (cin >> p1){
        p2 += p1;
    }
    cout << p2 << endl;

    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你好,陌生人 2022-09-10 09:11:30

1.当ctrl Z单独成行,或者说它前面没有任何字符(包括空格)时表示终止,其他情况他会被识别为一个无意义的字符。windows下的定义,和程序无关。

2.endl是刷新流。由于cin是遇到错误跳出的while循环,所以不用cin.clear()刷新状态位也是没办法重新进入输入的。你第二个程序会输出原来输入的字母,不是因为数据还在流里面,而是因为运行完第一个while,输入数据被保存在了全局对象p2中,同时由于没有重置状态,程序直接跳过了第二个while循环,直接输出了p2的内容

解决办法:两个while循环间加入cin.clear()和cin.sync()(不想换行输入ctrl+z还可以加个cin.ignore())

深海夜未眠 2022-09-10 09:11:30
  • linxu :通过Ctrl+D设置EOF即可

  • windows 通过Ctrl+Z 设置EOF即可

代码中添加cin.clear()

#include <iostream>
#include <string>
using namespace std;

int main(){
    string p1, p2;
    
    cout << "first" << endl;
    while (cin >> p1){//
        p2 += p1;
    }
    cout << p2 << endl;
    
    cin.clear();//重新清空一下流的标志位,包括EOF
    
    cout << '\n' <<"second" <<endl;
    while (cin >> p1){
        p2 += p1;
    }
    cout << p2 << endl;

    return 0;
}

Linux下的结果

EOF的输入

  • Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D);

  • Windows中,Ctrl-Z表示EOF。(顺便提一句,Linux中按下Ctrl-Z,表示将该进程中断,在后台挂起,用fg命令可以重新切回到前台;按下Ctrl-C表示终止该进程。)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按"字面含义"解读下一个输入,要是想按"字面含义"输入Ctrl-V,连续输入两次就行了。

引用自 阮老师的 EOF 是什么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文