окружите cin-вызов символом if.
Cin вернет false, если прочитаны неправильные данные.
так:
if (!cin >> i) {
cin.clear();
cin.ignore(INT_MAX, '\n');
cout << "Haha, your looping efforts have been thwarted dear sir\n";
}
cin.flush () должен сделать свое дело (согласно cppreference.com), но не на VS, очевидно.
cin.clear () сбрасывает все флаги в хорошее состояние.
cin.ignore с большим числом и до тех пор, пока '\ n' не будет работать.