コンソールで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 を除くすべての入力モードが有効になります。

ENABLE_PROCESSED_INPUT

CTRL+C がシステムによって処理され、入力バッファに格納されません。ReadFile 関数または ReadConsole 関数で入力バッファの読み取りを行う場合、他の制御キーはシステムによって処理され、ReadFile 関数または ReadConsole 関数のバッファに返されません。

http://msdn.microsoft.com/ja-jp/library/cc429744.aspx

どう処理されるか書いてないけども、EOFでも返すんじゃないのかなーこれ。

*1:今回の場合Ctrl+Cに割り当てた機能を呼び出そうとしてタイミングがずれたっぽい

*2:デフォルトでは