Я полный новичок, который пытается обдумать, как работает 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).
Чего мне не хватает?