首頁  >  問答  >  主體

C++ Cin输入问题

  1. 问题:为什么我在输入完第一组数据后,输入EOF(Ctrl+D)终止第一组数据输入,第二组数据尚未等我输入即已结束?

  2. 相关代码

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> vec1;
        vector<int> 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)等清空输入缓冲等方法后,依旧无效。求各位高人指教,谢谢!

高洛峰高洛峰2764 天前561

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 14:24:23

    1.確實是輸入問題,但也是流狀態位的問題。當輸入數字後直接eof會被辨識為字元保存在緩衝中,置位的是failbit而不是eof,輸入數字後回車換行再eof則是eof置位,下面的程式可以反映這一點。

    2.如果按題主的程式運行,即便正確的進行了eof,由於第一個while結束以後eof置位,所以第二個while循環還是不會執行。當加入clear()後,只要正確eof就可以實現題主預期,進入第二個while迴圈進行輸入。但如果單純的只是加入clear方法,而輸入時還是直接在數字後面eof時,由於eof被當作字符保存在緩衝中,所以第二個循環開始後,流檢測到緩衝中的字符,還是會置位元failbit導致循環跳出。

    3.fflush有用。但要配合cin.clear()使用,因為狀態位元和緩衝是兩個概念,即便清空了緩衝,狀態位元該是啥還是啥。使用fflush之後可以實現不換行直接eof(cin.clear()後面加上cin.ignore()可實現同樣功能)。

    環境:win10 64位元+vs2015社群版

    #include <iostream>
    #include <vector>
    #include <stdlib.h>
    
    using namespace std;
    int main() {
        vector<int> vec1;
        vector<int> vec2;
    
        int tmp;
        cout << "Input the Vec1`s elements:";
        while (cin >> tmp) {
            vec1.push_back(tmp);
        }
        cout<<"badbit  is "<<cin.bad()<<endl;
        cout<<"failbit is "<<cin.fail()<<endl;
        cout<<"eofbit  is "<<cin.eof()<<endl;
        cout<<"goodbit is "<<cin.good()<<endl;
    
        cin.clear();
        cin.ignore();
        //fflush(stdin);
    
        cout << endl << "Input the Vec2`s elements:";
    
        while (cin >> tmp) {
            vec2.push_back(tmp);
        }
        //system("pause")
        return 0;
    }

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:24:23

    詳見 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) 沒用是很正常的。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:24:23

    研究後,判斷問題是環境問題,但是目前還沒有找到可以解決這個問題的方法,不知道是不是跟編譯器有關

    回覆
    0
  • 取消回覆