C++ Cin输入问题
高洛峰
高洛峰 2017-04-17 14:22:23
0
3
583
  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)等清空输入缓冲等方法后,依旧无效。求各位高人指教,谢谢!

高洛峰
高洛峰

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

全員に返信(3)
大家讲道理

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
Peter_Zhu

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

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

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

いいねを押す +0
黄舟

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート