C++ Cin输入问题
高洛峰
高洛峰 2017-04-17 14:22:23
[C++讨论组]
  1. 问题:为什么我在输入完第一组数据后,输入EOF(Ctrl+D)终止第一组数据输入,第二组数据尚未等我输入即已结束?

  2. 相关代码

    #include 
    #include 
    
    using namespace std;
    
    int main() {
        vector vec1;
        vector vec2;
    
        int tmp;
        cout << "Input the Vec1`s elements:";
        while (cin >> tmp) {
            vec1.push_back(tmp);
        }
    
        cout << endl << "Input the Vec2`s elements:";
    
        while (cin >> tmp) {
            vec2.push_back(tmp);
        }
    
        return 0;
    }
  3. 相关贴图(测试环境:Xcode 7.3.1 OSX EI Capitan)

  4. 个人思考

    • 思考:个人认为,本问题应该属于缓冲区问题,可能是EOF(Ctrl+D)留在了缓冲中,然后直接被读入第二组数据,从而第二组数据未读取即结束。但我尝试在读取第二组数据前增添诸如 fflush(stdin)等清空输入缓冲等方法后,依旧无效。求各位高人指教,谢谢!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
天蓬老师

详见 c++ reference/istream

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> v1;
  std::vector<int> v2;
  int tmp;
  
  for (; std::cin >> tmp; ) {
    v1.push_back(tmp);
  }

  std:: cin.clear();
  
  for (; std::cin >> tmp; ) {
    v2.push_back(tmp);
  }

  for (int x : v1) {
    std::cout << x << ' ';
  }
  std::cout << std::endl;

  for (int x : v2) {
    std::cout << x << ' ';
  }
  std::cout << std::endl;
  return 0;
}

另外,这不是缓冲问题,是 istream 有个表示 eof 的标志位,所以 fflush(stdin) 没用是很正常的。

黄舟

研究后,判断问题是环境问题,但是目前还没有找到可以解决这个问题的方法,不知道是不是与编译器有关

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号