コンソールでCtrl+Cを押すとcinが失敗状態になる話
iostream使い慣れてないんです。
#include <iostream> using namespace std; void main() { for(;;){ int a, b; cin >> a; cin >> b; ... } }
こんな感じのやっつけプログラム。SetConsoleCtrlHandlerを使って、Ctrl+Cが押されたらこのループの頭に戻る。
で、稀にこの入力フェーズがスキップされ続けてしまうという問題が発覚。入力待ちの状態でCtrl+Cが押される*1と、以降の入力ができなくなる。
結論としては、iostreamでコンソールから入力待ちしてる時にCtrl+Cを押すとfail,eofビットがオンになってしまうのでclearが必要だった。というか例外とか投げてくれない*2のね。
コンソールの作成時、既定値で ENABLE_WINDOW_INPUT を除くすべての入力モードが有効になります。
http://msdn.microsoft.com/ja-jp/library/cc429744.aspxENABLE_PROCESSED_INPUT
CTRL+C がシステムによって処理され、入力バッファに格納されません。ReadFile 関数または ReadConsole 関数で入力バッファの読み取りを行う場合、他の制御キーはシステムによって処理され、ReadFile 関数または ReadConsole 関数のバッファに返されません。
どう処理されるか書いてないけども、EOFでも返すんじゃないのかなーこれ。