问题:为什么我在输入完第一组数据后,输入EOF(Ctrl+D)终止第一组数据输入,第二组数据尚未等我输入即已结束?
相关代码
#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;
}
相关贴图(测试环境:Xcode 7.3.1 OSX EI Capitan)
个人思考
思考:个人认为,本问题应该属于缓冲区问题,可能是EOF(Ctrl+D)留在了缓冲中,然后直接被读入第二组数据,从而第二组数据未读取即结束。但我尝试在读取第二组数据前增添诸如 fflush(stdin)等清空输入缓冲等方法后,依旧无效。求各位高人指教,谢谢!
大家讲道理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 コミュニティ エディション
天蓬老师2017-04-17 14:24:23
詳細については、C リファレンス/istream
を参照してください。 リーリーさらに、これはバッファリングの問題ではありませんが、istream には eof を示すフラグがあるため、fflush(stdin) が役に立たないのは正常です。