Урок №209. Функционал классов ostream и ios. Форматирование вывода
Обновл. 15 Сен 2021 |
На этом уроке мы рассмотрим функционал классов ostream и ios в языке С++.
Форматирование вывода
Есть два способа управления параметрами форматирования вывода:
флаги — это логические переменные, которые можно включить/выключить;
манипуляторы — это объекты, которые помещаются в поток и влияют на способ ввода/вывода данных.
Для включения флага используйте функцию setf() с соответствующим флагом в качестве параметра. Например, по умолчанию C++ не выводит знак + перед положительными числами. Однако, используя флаг std::showpos, мы можем это изменить:
Также можно включить сразу несколько флагов, используя побитовый оператор ИЛИ ( | ):
Чтобы отключить флаг, используйте функцию unsetf():
Многие флаги принадлежат к определенным группам форматирования. Группа форматирования — это группа флагов, которые задают аналогичные (иногда взаимоисключающие) параметры форматирования вывода. Например, есть группа форматирования basefield.
Флаги группы форматирования basefield:
oct (от англ. «octal» = «восьмеричный») — восьмеричная система счисления;
dec (от англ. «decimal» = «десятичный») — десятичная система счисления;
hex (от англ. «hexadecimal» = «шестнадцатеричный») — шестнадцатеричная система счисления.
Эти флаги управляют выводом целочисленных значений. По умолчанию установлен флаг std::dec, т.е. значения выводятся в десятичной системе счисления. Попробуем сделать следующее:
Ничего не работает! Почему? Дело в том, что setf() только включает флаги, он не настолько умен, чтобы одновременно отключать другие (взаимоисключающие) флаги. Следовательно, когда мы включаем std::hex, std::dec также включен и у него приоритет выше. Есть два способа решения данной проблемы.
Во-первых, мы можем отключить std::dec, а затем включить std::hex:
Теперь уже результат тот, что нужно:
Второй способ — использовать вариацию функции setf(), которая принимает два параметра:
первый параметр — это флаг, который нужно включить/выключить;
второй параметр — группа форматирования, к которой принадлежит флаг.
При использовании этой вариации функции setf() все флаги, принадлежащие группе форматирования, отключаются, а включается только передаваемый флаг. Например:
Язык C++ также предоставляет еще один способ изменения параметров форматирования: манипуляторы. Фишка манипуляторов в том, что они достаточно умны, чтобы одновременно включать и выключать соответствующие флаги. Например:
В общем, использовать манипуляторы гораздо проще, нежели включать/выключать флаги. Многие параметры форматирования можно изменять как через флаги, так и через манипуляторы, но есть и такие параметры форматирования, которые изменить можно либо только через флаги, либо только через манипуляторы.
Полезные флаги, манипуляторы и методы
Флаг:
Манипуляторы:
1 0
true false
1 0
true false
Флаг:
Манипуляторы:
Флаг:
uppercase — если включен, то используются заглавные буквы.
Манипуляторы:
uppercase — используются заглавные буквы.
nouppercase — используются строчные буквы.
1.23457e+007
1.23457E+007
1.23457e+007
1.23457E+007
Флаги группы форматирования basefield:
dec — значения выводятся в десятичной системе счисления;
hex — значения выводятся в шестнадцатеричной системе счисления;
oct — значения выводятся в восьмеричной системе счисления.
Манипуляторы:
dec — значения выводятся в десятичной системе счисления;
hex — значения выводятся в шестнадцатеричной системе счисления;
oct — значения выводятся в восьмеричной системе счисления.
Теперь вы уже должны понимать связь между флагами и манипуляторами.
Точность, запись чисел и десятичная точка
Используя манипуляторы (или флаги), можно изменить точность и формат вывода значений типа с плавающей точкой.
Флаги группы форматирования floatfield:
fixed — используется десятичная запись чисел типа с плавающей точкой;
scientific — используется экспоненциальная запись чисел типа с плавающей точкой;
showpoint — всегда отображается десятичная точка и конечные нули для чисел типа с плавающей точкой.
Манипуляторы:
fixed — используется десятичная запись значений;
scientific — используется экспоненциальная запись значений;
showpoint — отображается десятичная точка и конечные нули чисел типа с плавающей точкой;
noshowpoint — не отображаются десятичная точка и конечные нули чисел типа с плавающей точкой;
setprecision(int) — задаем точность для чисел типа с плавающей точкой.
Методы:
precision() — возвращаем текущую точность для чисел типа с плавающей точкой;
precision(int) — задаем точность для чисел типа с плавающей точкой.
Если используется десятичная или экспоненциальная запись чисел, то точность определяет количество цифр после запятой/точки. Обратите внимание, если точность меньше количества значащих цифр, то число будет округлено. Например:
Работа с файлами в C++. Часть 1 – Библиотека fstream.
Наиболее частые операции следующее:
Это не все возможности, которые предоставляет библиотека fstream. Рассматривать все сейчас мы не будем, поскольку их круг применения достаточно узок. Познакомимся с вышеперечисленными. Начнем с класса чтения.
Класс ifstream
Предоставляет возможности для чтения файлов. Открыть файл можно двумя способами: вызвав метод open() или указав путь к нему в конструкторе. Вам необходимо подготовить текстовый файл, перед тем, как начать набирать код. На диске d создайте папку с именем 1 и в ней создайте файл с расширением txt – “файл.txt”.
Открытие файла в конструкторе выглядит так:
Так мы просим открыть файл txt с именем файл.txt, который лежит в папке с названием 1, а папка находится на диске d.
Использование метода open() удобно, если программист не хочет сразу привязываться к файлу. Вдруг нужно свойство класса или глобальную переменную, ну а открывать файл уже потом. Если же нужно открыть файл внутри некой функции, поработать с ним и закрыть, то можно прописать путь к файлу прямо в конструкторе. В общем зависит от ситуации.
Открыв файл, желательно прописать проверку: открылся ли он? Так как есть ряд причин, по которым файл может не открыться, а мы этого не увидим. Например, файла с указанным именем нет в прописанной папке или путь указан неверно. Можно пойти двумя путями: проверить переменную файла в логическом выражении (применив оператор “!”, к примеру) или использовать метод is_open() :
Так все отработает нормально и файл откроется:

Второй вариант проверки с использованием метода is_open() :
Если файл не открыт – желательно обработать ошибку. Как правило, если вся работа программы связана с файлом пишут некое сообщение в консоль, и ставят выход из программы. При серьезных ошибках принято возвращать некий код выполнения (число), который будет характеризовать ту или иную ошибку. Коды для каждого вида ошибок автор программы может придумывать свои. Один из способов обработки ошибок в программе мы рассматривали в статье Исключения в С++.
Если файл успешно открыт, из него можно производить чтение.
Оператор считывания >>
Считает вещественное, целое и строку. Считывание строки закончится, если появится пробел или конец строки. Стоит отметить, что оператор >> применяется к текстовым файлам. Считывание из бинарного файла производить лучше всего с помощью метода read().
Кстати этот оператор достаточно удобен, если стоит задача разделить файл на слова:
Методы getline() и get()
Считывание целой строки до перевода каретки производится так же как и в iostream методом getline(). Причем рекомендуется использовать его переопределеную версию в виде функции, если считывается строка типа string:
Если же читать нужно в массив символов char[], то либо get() либо getline() именно как методы:
Метод read()
Похож на предыдущий пример?
Собственно тут тот же результат – считается указанное количество символов. Исключение только в том, что нельзя указать разделитель. read() применяется для неформатированного ввода. Призван в первую очередь читать бинарные файлы. Поскольку текстовый файл – частный случай бинарного, этот метод вполне применим и к текстовому файлу.
Метод close()
Закрывает файл. Даже добавить нечего. Единственная пожалуй ремарка – от того, что файл, открытый для чтения, не будет закрыт этим методом как правило хуже не станет. Очень редки ситуации, когда открытый для чтения файл портится, если завершить программу не закрывая файл. Связана эта порча прежде всего с нестандартными устройствами типа стримеров на магнитной ленте или каких нибудь потоковых хитрых промышленных контроллерах, но по феншую стоит запомнить – открытый файл должен быть закрыт. Это считается хорошим тоном.
Метод eof()
Проверяет не достигнут ли конец файла. Т.е. можно ли из него продолжать чтение. Выше пример с считкой слов оператором >> как раз использует такую проверку.
Метод seekg()
Производит установку текущей позиции в нужную, указываемую числом. В этот метод так же передается способ позиционирования:
std:: ios_base
| Compiler support | ||||
| Freestanding and hosted | ||||
| Language | ||||
| Standard library headers | ||||
| Named requirements | ||||
| Feature test macros (C++20) | ||||
| Language support library | ||||
| Concepts library (C++20) | ||||
| Diagnostics library | ||||
| General utilities library | ||||
| Strings library | ||||
| Containers library | ||||
| Iterators library | ||||
| Ranges library (C++20) | ||||
| Algorithms library | ||||
| Numerics library | ||||
| Localizations library | ||||
| Input/output library | ||||
| Filesystem library (C++17) | ||||
| Regular expressions library (C++11) | ||||
| Atomic operations library (C++11) | ||||
| Thread support library (C++11) | ||||
| Technical specifications | ||||
| Symbols index | ||||
| External libraries |
The class ios_base is a multipurpose class that serves as the base class for all I/O stream classes. It maintains several kinds of data:
Typical implementation holds member constants corresponding to all values of fmtflags, iostate, openmode, and seekdir shown below, member variables to maintain current precision, width, and formatting flags, the exception mask, the buffer error state, a resizeable container holding the callbacks, the currently imbued locale, the private storage, and a static integer variable for xalloc().
ios_base Class
The class describes the storage and member functions common to both input and output streams that do not depend on the template parameters. (The class template basic_ios describes what is common and is dependent on template parameters.)
An object of class ios_base stores formatting information, which consists of:
Two extensible arrays, with elements of type long and void pointer.
Members
Constructors
Typedefs
Enums
Constants
Functions
Operators
Requirements
Header:
Namespace: std
event
Specifies event types.
Remarks
Example
event_callback
Parameters
_Base
The stream in which the event was called.
_I
A user-defined number.
Remarks
Example
failure
The class failure defines the base class for the types of all objects thrown as exceptions, by functions in the iostreams library, to report errors detected during stream buffer operations.
Remarks
Example
flags
Sets or returns the current flag settings.
Parameters
fmtfl
The new fmtflags setting.
Return Value
The previous or current fmtflags setting.
Remarks
See ios_base::fmtflags for a list of the flags.
The first member function returns the stored format flags. The second member function stores fmtfl in the format flags and returns its previous stored value.
Example
fmtflags
Constants to specify the appearance of output.
Remarks
The type is a bitmask type that describes an object that can store format flags. The distinct flag values (elements) are:
In addition, several useful values are:
getloc
Returns the stored locale object.
Return Value
The stored locale object.
Example
imbue
Changes the locale.
Parameters
_Loc
The new locale setting.
Return Value
The previous locale.
Remarks
Example
Creates the standard iostream objects when constructed.
Remarks
The nested class describes an object whose construction ensures that the standard iostream objects are properly constructed, even before the execution of a constructor for an arbitrary static object.
ios_base
Constructs ios_base objects.
Remarks
The (protected) constructor does nothing. A later call to basic_ios:: init must initialize the object before it can be safely destroyed. Thus, the only safe use for class ios_base is as a base class for class template basic_ios.
iostate
The type of constants that describe the state of a stream.
Remarks
The type is a bitmask type that describes an object that can store stream state information. The distinct flag values (elements) are:
iword
Parameters
Remarks
If idx is negative or if unique storage is unavailable for the element, the function calls setstate (badbit) and returns a reference that might not be unique.
Example
openmode
Describes how to interact with a stream.
Remarks
The opening mode for several iostream objects. The flag values are:
| Constant | Effect |
|---|---|
| app | Seek to the end of the stream before each write |
| ate | Seek to the end of the stream immediately after open |
| binary | Open in binary mode. (See fopen for a description of binary mode.) |
| in | Open for reading |
| out | Open for writing |
| trunc | delete the contents of the file after open |
Example
operator=
The assignment operator for ios_base objects.
Parameters
Return Value
The object being assigned to.
Remarks
precision
Specifies the number of digits to display in a floating-point number.
Parameters
_Prec
The number of significant digits to display, or the number of digits after the decimal point in fixed notation.
Return Value
The first member function returns the stored display precision. The second member function stores _Prec in the display precision and returns its previous stored value.
Remarks
Floating-point numbers are displayed in fixed notation with fixed.
Example
pword
Parameters
Remarks
If index is negative, or if unique storage is unavailable for the element, the function calls setstate (badbit) and returns a reference that might not be unique.
Example
register_callback
Specifies a callback function.
Parameters
pfn
Pointer to the callback function.
idx
A user-defined number.
Remarks
Example
seekdir
Specifies starting point for offset operations.
Remarks
The type is an enumerated type that describes an object that can store the seek mode used as an argument to the member functions of several iostream classes. The distinct flag values are:
Example
Sets the specified flags.
Parameters
_Mask
The flags to turn on.
_Unset
The flags to turn off.
Return Value
The previous format flags
Remarks
The first member function effectively calls flags(_Mask | _Flags) (set selected bits) and then returns the previous format flags. The second member function effectively calls flags(_Mask & fmtfl, flags &
_Mask) (replace selected bits under a mask) and then returns the previous format flags.
Example
sync_with_stdio
Ensures that iostream and C run-time library operations occur in the order that they appear in source code.
Parameters
Return Value
Previous setting for this function.
Remarks
unsetf
Turns the specified flags off.
Parameters
_Mask
The flags that you want to turn off.
Remarks
The member function effectively calls flags(
Example
width
Sets the length of the output stream.
Parameters
_Wide
The desired size of the output stream.
Return Value
The current width setting.
Remarks
The first member function returns the stored field width. The second member function stores _Wide in the field width and returns its previous stored value.
Example
xalloc
Specifies that a variable is part of the stream.
Return Value
The static member function returns a stored static value, which it increments on each call.
Remarks
Класс ios_base
Этот класс описывает хранилище и функции-члены общие для обоих потоков (ввода и вывода), не зависящих от параметров шаблона. (Шаблон класса basic_ios описывает общие параметры и зависит от параметров шаблона.)
Объект класса ios_base хранит сведения о форматировании, состоящие из следующих элементов:
Два расширяемых массива с элементами типа long и void указателя.
Объект класса ios_base также хранит сведения о состоянии потока в объекте типа iostate и стеке обратного вызова.
Члены
Конструкторы
Определения типов
Перечисления
Константы
Функции
Операторы
Требования
Заголовок: iOS>
Пространство имен: std
event
Задает типы событий.
Комментарии
Пример
event_callback
Параметры
_Base
Поток, в котором был вызов события.
_I
Определенное пользователем число.
Комментарии
Пример
failure
Комментарии
Пример
flags
Задает или возвращает текущие параметры флага.
Параметры
Возвращаемое значение
Комментарии
ios_base::fmtflags Список флагов см. в разделе.
Первая функция-член возвращает сохраненные флажки формата. Вторая функция-член сохраняет fmtfl во флажках формата и возвращает свое ранее сохраненное значение.
Пример
fmtflags
Константы для определения внешнего вида выходных данных.
Комментарии
Тип — это тип битовой маски, описывающий объект, который может хранить флаги формата. Ниже перечислены значения различных флагов (элементы).
Кроме того, ниже приведено несколько полезных значений:
getloc
Возвращает сохраненный объект языкового стандарта.
Возвращаемое значение
Сохраненный объект языкового стандарта.
Пример
imbue
Изменяет языковой стандарт.
Параметры
_Loc
Новое значение языкового стандарта.
Возвращаемое значение
Предыдущий языковой стандарт.
Комментарии
Пример
Создает стандартные iostream объекты при создании.
Комментарии
Вложенный класс описывает объект, построение которого гарантирует, что стандартные iostream объекты должным образом созданы, даже перед выполнением конструктора для произвольного статического объекта.
ios_base
Создает объекты ios_base.
Комментарии
(Защищенный) конструктор ничего не делает. Последующий вызов basic_ios:: basic_ios:: должен инициализировать объект, прежде чем его можно будет безопасно уничтожить. Таким образом, единственное безопасного использования класса ios_base является базовым классом для basic_iosшаблона класса.
iostate
Тип констант, описывающих состояние потока.
Комментарии
Тип — это тип битовой маски, описывающий объект, который может хранить данные о состоянии потока. Ниже перечислены значения различных флагов (элементы).
iword
Параметры
Комментарии
Если idx является отрицательным или если для элемента недоступно уникальное хранилище, функция вызывает setstate (badbit) и возвращает ссылку, которая может быть неуникальной.
Пример
openmode
Описывает процесс взаимодействия с потоком.
Комментарии
Режим открытия для нескольких iostream объектов. Значения флагов:
| Константа | Действие |
|---|---|
| app | Поиск в конце потока перед каждой записью |
| ate | Поиск в конце потока сразу после открытия |
| binary | Открыть в двоичном режиме. ( fopen Описание двоичного режима см. в разделе). |
| in | Открыть для чтения |
| out | Открыть для записи |
| trunc | удалить содержимое файла после открытия |
Пример
operator=
Оператор присваивания для объектов ios_base.
Параметры
Возвращаемое значение
Объект, которому выполняется присваивание.
Комментарии
precision
Задает количество цифр для отображения числа с плавающей запятой.
Параметры
_Prec
Количество значащих цифр при отображении, или количество цифр после десятичной запятой в фиксированной нотации.
Возвращаемое значение
Первая функция-член возвращает сохраненное количество цифр для отображения. Вторая функция – член сохраняет _Prec в точности экрана и возвращает свое предыдущее сохраненное значение.
Комментарии
Числа с плавающей запятой отображаются в фиксированной нотации с помощью fixed.
Пример
pword
Параметры
Комментарии
Функция-член возвращает ссылку на индекс элемента расширяемого массива с элементами типа Pointer. Все элементы эффективно присутствуют и изначально хранят нулевой указатель. Возвращенная ссылка является недопустимой после следующего вызова для pword объекта, после того, как объект изменен вызовом метода basic_ios:: copyfmt или после уничтожения объекта.
Если индекс является отрицательным или для элемента недоступно уникальное хранилище, функция вызывает (badbit) и возвращает ссылку, которая может быть неуникальной.
Пример
register_callback
Задает функцию обратного вызова.
Параметры
pfn
Указатель на функцию обратного вызова.
idx
Определенное пользователем число.
Комментарии
Пример
seekdir
Задает начальную точку для операций смещения.
Комментарии
Тип является перечислимым типом, описывающим объект, который может хранить режим поиска, используемый в качестве аргумента для функций-членов нескольких iostream классов. Ниже перечислены значения различных флагов.
Пример
Задает указанные флаги.
Параметры
_Mask
Флажки, которые нужно включить.
_Unset
Флаги, которые необходимо отключить.
Возвращаемое значение
Предыдущие флаги формата
Комментарии
Первая функция-член фактически вызывает flags(_Mask | _Flags) (устанавливает выбранные биты), а затем возвращает предыдущие флаги формата. Вторая функция-член фактически вызывает flags(_Mask & fmtfl, flags &
_Mask) (заменяя выбранные биты в маске), а затем возвращает предыдущие флаги формата.
Пример
sync_with_stdio
Гарантирует, что iostream и операции с библиотекой времени выполнения C выполняются в том порядке, в котором они отображаются в исходном коде.
Параметры
Возвращаемое значение
Предыдущий параметр для этой функции.
Комментарии
unsetf
Отключает указанные флаги.
Параметры
_Mask
Флаги, которые необходимо отключить.
Комментарии
Функция-член фактически вызывает flags(
_Mask & flags) (очищает выбранные биты).
Пример
width
Задает длину потока вывода.
Параметры
_Wide
Нужный размер выходного потока.
Возвращаемое значение
Текущее значение ширины.
Комментарии
Первая функция – член возвращает ширину сохраненного поля. Вторая функция – член сохраняет _Wide ширину поля и возвращает свое предыдущее сохраненное значение.
Пример
xalloc
Указывает, что переменная является частью потока.
Возвращаемое значение
Статическая функция-член возвращает сохраненное статическое значение, которое увеличивается при каждом вызове.




