Для std::cin, существует ли ситуация, когда установлен только EOFBIT, но не FAILBIT?
Я полный новичок, который пытается понять, как работает std::istream.
Я выполнил несколько тестовых примеров (на компьютере с Windows - Windows версии 6.3.9600) с помощью этой простой программы, которую я написал:
int main()
{
char ch{0};
while (true)
{
if (cin >> ch)
{
cout << ch << " is read. ASCII Code: " << int(ch)
<< " current state of cin : " << bitset<3> (cin.rdstate())
<< endl;
}
else
{
//cin.fail()
cout << "Read failed. Current state of cin: "
<< bitset<3> (cin.rdstate()) << endl;
cin.clear();
}
}
}
Я должен отметить, что на моей машине, ios_base::failbit = 100
а также ios_base::eofbit = 010
Пример ввода 1: 12345[CTRL-Z]
Какие выводы:
1 is read. ASCII Code: 49 Current state of cin: 000
2 is read. ASCII Code: 50 Current state of cin: 000
3 is read. ASCII Code: 51 Current state of cin: 000
4 is read. ASCII Code: 52 Current state of cin: 000
5 is read. ASCII Code: 53 Current state of cin: 000
→ is read. ASCII Code: 26 Current state of cin: 000
В этот момент программа ожидает дальнейшего ввода.
Пример ввода 2: 12345[CTRL-Z]6789
Какие выводы:
1 is read. ASCII Code: 49 Current state of cin: 000
2 is read. ASCII Code: 50 Current state of cin: 000
3 is read. ASCII Code: 51 Current state of cin: 000
4 is read. ASCII Code: 52 Current state of cin: 000
5 is read. ASCII Code: 53 Current state of cin: 000
→ is read. ASCII Code: 26 Current state of cin: 000
... ждет дальнейшего ввода. Флаги все еще не были установлены, но символы после CTRL-Z полностью игнорируются, как если бы они были удалены из потока. Почему здесь не срабатывает EOFBIT? Я также посмотрел замещающий символ (код ASCII 26), который должен быть непечатным, но все равно печатается с символом стрелки вправо (почему?). И поскольку eofbit не запускается в тот момент, когда он был прочитан, я предполагаю, что Windows не обрабатывает заменяющий символ как символ EOF...
Пример ввода 3: [CTRL-Z]
Выход:
Read failed. Current state of cin: 110
И eofbit, и failbit устанавливаются, когда входной буфер пуст, за исключением символа [CTRL-Z].
Пример ввода 4: [CTRL-Z] 123456789
Выход:
Read failed. Current state of cin: 110
Тот же вывод, что и в третьем случае, и то, что идет после [CTRL-Z], игнорируется.
Похоже, что не существует случая, когда cin успешно читает [CTRL-Z] как символ EOF (то есть, eofbit установлен, а failbit - нет). В случаях, когда cin DOES читает [CTRL-Z] как символ, он не обрабатывает его как символ EOF (eofbit не установлен в примерах 1 и 2).
Что мне не хватает?