Для std :: cin, существует ли ситуация, когда установлен только EOFBIT, но не FAILBIT? - PullRequest
0 голосов
/ 28 сентября 2018

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

Чего мне не хватает?

...