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

查看:180
本文介绍了c++ - window如何判断cin输入流的结束?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

使用while(cin>>str)进行输入的时候,系统是如何判断输入流的结束的?

搜索一番之后,大多数的答案都说系统不会读取ctrl+z,但那个白框框是什么?window读取缓冲区数据的时候,应该是一边读取一边检测的吧?
还有下面这个

为什么第二个无法输入?读取完缓冲区的数据,为什么那些数据还在?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;
}

解决方案

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

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

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

这篇关于c++ - window如何判断cin输入流的结束?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆