Класс ios. Флаги форматирования. Манипуляторы класса ios. Функции класса ios
Ios является дедушкой всех потоковых классов и обладает большинством осо- бенностей, без которых работа с потоками была бы невозможна. Три его главных направления — это флаги форматирования, флаги ошибок и режим работы с фай- лами. Сначала мы обратимся к рассмотрению флагов форматирования, затем флагов состояния ошибки. Рассмотрение режима работы с файлами мы отложим до тех пор, пока не познакомимся с дисковыми файлами.
Флаги форматирования
Флаги форматирования — это набор определений enum (перечисляемого типа) в классе ios. Они работают переключателями, определяющими различные фор- маты и способы ввода/вывода. Мы не будем обсуждать подробно каждый флаг, так как одни мы уже использовали, а названия других говорят сами за себя. Не- которые мы обсудим позднее в этой же главе. В табл. 12.1 приводится полный список флагов форматирования.
Таблица 12.1. Флаги форматирования класса ios
| Флаг
| Значение
| skipws
| Пропуск пробелов при вводе
| left
| Выравнивание по левому краю
| right
| Выравнивание по правому краю
| internal
| Заполнение между знаком или основанием числа и самим числом
| dec
| Перевод в десятичную форму
| oct
| Перевод в восьмеричную форму
| hex
| Перевод в шестнадцатеричную форму
| boolalpha
| Перевод логического 0 и 1 соответственно в «false» и «true»
| showbase
| Выводить индикатор основания системы счисления (0 для восьмеричной, Ох для шестнадцатеричной)
| showpoint
| Показывать десятичную точку при выводе
| uppercase
| Переводить в верхний регистр буквы X, Е и буквы шестнадцатеричной системы счисления (ABCDEF) (по умолчанию — в нижнем регистре)
| showpos
| Показывать «+» перед положительными целыми числами
| scientific
| Экспоненциальный вывод чисел с плавающей запятой
| fixed
| Фиксированный вывод чисел с плавающей запятой
| unitbuf
| Сброс потоков после вставки
| stdio
| сброс stdout, sterror после вставки
|
Есть несколько способов установки флагов форматирования, для каждого свои. Так как они являются компонентами класса ios, обычно к ним обращаются посредством написания имени класса и оператора явного задания (например, ios::skipws). Все без исключения флаги могут быть выставлены с помощью мето- дов setf() и unsetf(). Взгляните на следующий пример:
cout.setf(ios::left); //выравнивание текста по левому краю
cout << "Этот текст выровнен по левому краю"
cout.unsetf(ios::left); //вернуться к прежнему форматированию
Многие флаги могут быть установлены с помощью манипуляторов, давайте рассмотрим их.
Манипуляторы
Манипуляторы — это инструкции форматирования, которые вставляются прямо в поток. Мы уже видели некоторые из них, например endl, который посылает символ разделителя строк в поток и сбрасывает буфер:
cout << "Jedem Das Seine." << endl;
Мы встречали в программе SALEMON, глава 7 «Массивы и строки», манипуля- тор setiosflags(). Вспомним, как он выглядит:
cout << setiosflags(ios::fixed) //использовать
//фиксированный вывод << setiosflags(ios::showpoint) //показывать десятичную
//точку
<< var;
Как показывают эти примеры, манипуляторы бывают двух видов — с аргу- ментами и без. В табл. 12.2 сведены вместе все важные манипуляторы без аргу- ментов.
Таблица 12.2. Манипуляторы ios без аргументов
| Манипулятор
| Назначение
| ws
| Включает пропуск пробелов при вводе
| dec
| Перевод в десятичную форму
| oct
| Перевод в восьмеричную форму
| hex
| Перевод в шестнадцатеричную форму
| endl
| Вставка разделителя строк и очистка выходного потока
| ends
| Вставка символа отсутствия информации для окончания выходной строки
| flush
| Очистка выходного потока
| lock
| Закрыть дескриптор файла
| unlock
| Открыть дескриптор файла
|
Вставляются эти манипуляторы прямо в поток. Например, чтобы вывести var в шестнадцатеричной форме, надо указать:
cout << hex << var;
Имейте в виду, что манипуляторы действуют только на те данные, которые следуют за ними в потоке, а не на те, которые находятся перед ними. На то он и поток. В табл. 12.3 представлены важнейшие из манипуляторов с аргументами. Для доступа к этим функциям вам потребуется заголовочный файл IOMANIP.
Таблица 12.3. Манипуляторы ios с аргументами
Манипулятор
| Аргумент
| Назначение
| setw()
| ширина поля (int)
| Устанавливает ширину поля для вывода данных
| Setfill()
| символ заполнения (int)
| Устанавливает символ заполнения (по умолчанию, пробел)
| setprecision()
| точность (int)
| Устанавливает точность(число выводимых знаков)
| setiosflags()
| Флаги форматирования (long)
| Устанавливает указанные флаги форматирования
| resetiosflags()
| Флаги форматирования (long)
| Сбрасывает указанные флаги форматирования
|
Функции
Класс ios содержит набор функций, с помощью которых можно выставлять флаги форматирования и выполнять некоторые другие действия. Таблица 12.4 содержит большинство этих функций, кроме тех, которые обрабатывают ошиб- ки. К последним мы обратимся позднее.
Таблица 12.4. Функции ios
Функция
| Назначение
| ch=fill();
| Возвращает символ заполнения (символ, которым заполняется
неиспользуемая часть текстового поля; по умолчанию — пробел)
| fill(ch);
| Устанавливает символ заполнения
| p=precision();
| Возвращает значение точности (число выводимых знаков для формата
с плавающей запятой)
| precision(p);
| Устанавливает точность р
| w=width();
| Возвращает текущее значение ширины поля (в символах)
| width(w);
| Устанавливает ширину текущего поля
| setf(flags);
| Устанавливает флаг форматирования (например, ios::left)
| unsetf(flags);
| Сбрасывает указанный флаг форматирования
| setf(flags, field);
| Очищает поле, затем устанавливает флаги форматирования
|
Эти функции вызываются для нужных потоковых объектов обычным спосо- бом — через точку. Например, чтобы установить ширину поля 12, можно написать:
cout.width(14);
Следующее выражение делает символом заполнения звездочку (как при тес- тировании печати):
cout.fill('*');
Можно использовать некоторые функции, чтобы манипулировать напрямую установкой флагов форматирования. Например, так можно установить вырав- нивание по левому краю:
cout.setf(ios:: left);
Чтобы восстановить выравнивание по правому краю, напишем:
cout.unsetf(ios::left);
Версия setf() с двумя аргументами использует второй из них для сбрасы- вания всех флагов указанного типа (в поле). При этом установится флаг, ука- занный в качестве первого аргумента. Таким образом, проще сбросить флаги перед установкой нового. В табл. 12.5 показан способ обращения с этой функ- цией.
Например, cout.setf(ios::left, ios::adjustfield);
сбрасывает все флаги, связанные с выравниванием текста, а затем устанавливает флаг left для выравнивания по левому краю.
Таблица 12.5. Версия setf() с двумя аргументами
Первый аргумент: устанавливаемые флаги
| Второй аргумент: сбрасываемые флаги
| dec, oct, hex
| basefield
| left, right, internal
| adjustfield
| scientific, fixed
| floatfield
|
С использованием указанной техники можно создать способ форматирован- ного ввода/вывода не только с клавиатуры и на дисплей, но, как мы увидим позднее в этой главе, также и для файлов.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | Поиск по сайту:
|