OK, to trochę dziwne, ale trzeba najwyraźniej dać zarówno std::cin.clear(); jak i clearerr(stdin);:
#include <iostream>
#include <limits>
#include <stdio.h>
#include <unistd.h>
int main() {
int c;
while (true) {
std::cout << "in" << std::endl;
while ((c = std::cin.get()) != EOF) {
std::cout.put(c);
}
if (std::cin.eof()) {
std::cout << "eof" << std::endl;
std::cin.clear();
clearerr(stdin);
}
std::cout << "out" << std::endl;
}
return 0;
}
Przypuszczam, że wynika to z tego, że cin wewnętrznie korzysta z stdin, ale cin.clear nie propaguje wyczyszczenia błędu do warstwy niżej (tylko ustawia goodbit swojemu obiektowi).