format_guard _;
cout << hex << scientific << showbase << uppercase;
cout << "Numbers with special formatting:\n";
cout << 0x123abc << '\n';
cout << 0.123456789 << '\n';
}
6. После того как выведем некоторые числа с помощью флагов форматирования, покинем область видимости. В результате деструктор класса format_guard
cout << "Same numbers, but normal formatting again:\n";
cout << 0x123abc << '\n';
cout << 0.123456789 << '\n';
7. Теперь воспользуемся классом scientific_type
scientific_type
.Соответственно, оно будет выведено с применением нашего особенного стиля форматирования, а числа, стоящие перед ним и после него, будут иметь форматирование по умолчанию. В то же время мы избежим появления ненужных символов.
cout << "Mixed formatting: "
<< 123.0 << " "
<< scientific_type{123.0} << " "
<< 123.456 << '\n';
}
8. Компиляция и запуск программы дадут следующий результат. Первые два числа будут выведены с конкретным форматированием. Следующие два будут иметь форматирование по умолчанию — это показывает, что наш класс format_guard
scientific_type
, остальные же имеют форматирование по умолчанию:$ ./pretty_print_on_the_fly
Numbers with special formatting:
0X123ABC
1.234568E-01
Same numbers, but normal formatting again:
1194684
0.123457
Mixed formatting: 123 +1.230000E+02 123.456
Перехватываем читабельные исключения для ошибок потока std::iostream
Ни в одном из примеров, показанных в данной главе, мы не использовали для обнаружения ошибок
if (cin >> foo >> bar >> ...)
. В случае сбоя этой конструкции мы его обработаем. Использование конструкции try {...} catch...
при преобразовании объектов не кажется очень полезным.Фактически библиотека для работы с потоками ввода/вывода в C++ существовала уже в те времена, когда язык C++ еще не работал с исключениями. Поддержка исключений была добавлена позже, это объясняет отсутствие их первоклассной поддержки в потоковой библиотеке.
Применение исключений для потоковой библиотеки возможно при конфигурации каждого отдельного объекта потока таким образом, чтобы он генерировал исключение в тот момент, когда входит в ошибочное состояние. К сожалению, пояснения к ошибкам, лежащие в объектах исключений, которые мы будем отлавливать, не стандартизированы. Это приводит к появлению не очень информативных сообщений об ошибках, их мы рассмотрим в данном разделе. Если вы действительно хотите использовать исключения для объектов потока, то можете
В данном разделе мы напишем программу, которая может генерировать множество разных сбоев, обработаем их с помощью исключений и увидим, как получить более подробное описание этих ошибок.
Как это делается
В этом примере мы реализуем программу, которая открывает файл (тут может быть сгенерирован сбой), а затем считаем оттуда целое число (здесь тоже возможен сбой). Сделаем это с помощью активизированных исключений, а затем увидим, как их обработать.
1. Сначала включим некоторые заголовочные файлы и объявим об использовании пространства имен std
#include
#include
#include
#include
using namespace std;