検索

ホームページ  >  に質問  >  本文

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)等清空输入缓冲等方法后,依旧无效。求各位高人指教,谢谢!

高洛峰高洛峰2804日前586

全員に返信(3)返信します

  • 大家讲道理

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

    1. これは確かに入力の問題ですが、フロー ステータス ビットの問題でもあります。数値を入力すると、eof が文字として認識され、eof の代わりにフェイルビットが設定されます。次のプログラムでは、eof を入力します。これを反映させます。

    2. トピックに従ってプログラムを実行すると、eof が正しく実行されたとしても、eof は最初の while の終了後に設定されるため、2 番目の while ループは実行されません。 clear() が追加されると、eof が正しい限り、サブジェクトの期待は達成され、2 番目の while ループが入力のために入ります。ただし、clear メソッドを追加して数値の直後に eof を入力した場合、eof は文字としてバッファに格納されるため、2 番目のループの開始後も、ストリームはバッファ内で文字を検出したときに文字を設定します。フェイルビットによりループが終了します。

    3.fflush は便利です。ただし、ステータス ビットとバッファリングは 2 つの異なる概念であるため、バッファがクリアされてもステータス ビットはそのままである必要があるため、cin.clear() と組み合わせて使用​​する必要があります。 fflush を使用すると、改行なしで直接 eof を実行できます (cin.clear() に続いて cin.ignore() を実行すると同じ機能を実現できます)。

    環境: win10 64 ビット vs2015 コミュニティ エディション

    リーリー

    返事
    0
  • 天蓬老师

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

    詳細については、C リファレンス/istream

    を参照してください。 リーリー

    さらに、これはバッファリングの問題ではありませんが、istream には eof を示すフラグがあるため、fflush(stdin) が役に立たないのは正常です。

    返事
    0
  • 黄舟

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

    調査の結果、問題は環境の問題であることが判明しましたが、現時点ではこの問題を解決する方法はありません。コンパイラに関連しているかどうかはわかりません。

    返事
    0
  • キャンセル返事