Программирование: принципы и практика использования C++, второе издание: путаница в состояниях потока и логике программыC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Программирование: принципы и практика использования C++, второе издание: путаница в состояниях потока и логике программы

Сообщение Anonymous »

Сейчас я читаю 10-ю главу книги Страуструпа PPP2.
Во время чтения страниц с 360 по 362 я сильно запутался. Проще говоря, я понятия не имею, почему написанная им программа вообще работает так, как задумано. Он проверяет наличие метода Fail(), а затем — Bad(). Когда он НЕЯВНО проверяет наличие bad(), он использует оператор else и указывает это в комментарии рядом с else. Проблема в том, что это даже не должно работать (по крайней мере, я так считаю, а убеждения могут быть на 100% ошибочными, поэтому я и спрашиваю об этом). Используя else, он неявно проверяет наличие eof(), а не bad(). Это связано с тем, что ранее он заявлял, что когда установлен badbit, также устанавливается и FailBit, а это означает, что, проверяя на error(), он также проверяет и на bad(). Таким образом, else должен проверять только eof().
Другая проблема, с которой я столкнулся, заключалась в следующем. На тех же страницах, КАЖЕТСЯ, всплывает еще одна ошибка. Он пишет две функции: Skip_to_int() и get_int(). Цикл в get_int() довольно прост: он работает вечно и пытается «упорно» получить целое число. Если оператор терпит неудачу, мы выводим сообщение и вызываем jump_to_int(). Эта функция проверяет наличие методаfail() и, если да, удаляет все нецифровые символы, которые она может найти, в надежде найти целое число, которое get_int() сможет восстановить на следующей итерации цикла. Проблема в том, что при попытке заставить программу работать она работает не так, как задумано. Я отлаживаю его, ввожу управляющий символ EOF (Ctrl+Z), и он просто печатает сообщение «Извините...». Разве я не должен вместо этого получить исключение? В конце концов, я ввожу сигнал EOF, который должен немедленно привести к тому, что оператор не сможет покинуть istream с состоянием eof(). Но у меня нет такого исключения. Я могу просто ввести другое целое число. Кроме того, если сначала тестируется метод Fail(), то, если поток плохой(), код Skip_to_int() не должен достигать функции error(). Но он настаивает на том, что это так.
Вот код из книги для этих двух задач:
Первая задача:

Код: Выделить всё

int n = 0;

while (true)
{
cin >> n;

if (cin) {
if (1  ch; )
{
if (isdigit(ch) || ch == '-')
{
cin.unget();

return;
}
}
}

error("no input");              //eof or bad: give up
}

int get_int()
{
int n = 0;

while (true)
{
if (cin >> n) return n;

cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79356328/programming-principles-and-practice-using-c-second-edition-confusion-about-s[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»