ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4244
Скачиваний: 28
Глава 40. Потоки ввода/вывода в C++
461
showpoint
— вывод десятичной точки в числе с плавающей
точкой;
showpos
— вывод знака
+
перед неотрицательными числами;
skipws
— пропуск ведущих пробелов при вводе;
unitbuf
— освобождение потока при каждой операции вывода;
uppercase
— вывод прописных букв в некоторых форматах,
например, символ
E
в числе с плавающей точкой;
adjustfield
— эквивалентно
internal|left|right
;
basefield
— эквивалентно
dec|hex|oct
;
floatfield
— эквивалентно
fixed|scientific
.
Для работы с флагами в классе
ios_base
определены следующие
функции:
fmtflags flags() const;
fmtflags flags(fmtflags fmtfl);
fmtflags setf(fmtflags fmtfl);
fmtflags setf(fmtflags fmtfl, fmtflags mask);
void unsetf(fmtflags mask);
Эти функции выполняют следующие действия:
flags
— первая функция возвращает значение битовой маски;
вторая функция сохраняет в битовой маске значение, заданное
параметром
fmtfl
, и возвращает предыдущее значение бито-
вой маски;
setf
— первая функция устанавливает биты, заданные пара-
метром
fmtfl
, и возвращает предыдущее значение битовой
маски; вторая функция сбрасывает в битовой маске флаги, ус-
тановленные в параметре
mask
, затем устанавливает в битовой
маске флаги, которые установлены как в параметре
fmtfl
, так
и в параметре
mask
, возвращает предыдущее значение битовой
маски;
unsetf
— сбрасывает в битовой маске флаги, установленные
в параметре
mask
.
Часть IV. Стандартная библиотека языка программирования С++
462
Пример установки и сброса некоторых флагов показан в
листинге 40.1.
Листинг 40.1. Пример установки и сброса управляющих флагов
#include <iostream>
using namespace std;
int main()
{
cout.setf(ios::boolalpha); // символьные булевы значения
cout << false << ' ' << true << endl; // false true
// установить 16 c/c в качестве базовой
cout.setf(ios_base::hex, ios_base::basefield);
cout.setf(ios_base::showbase); // показывать базу
cout << 32 << endl; // 0x20
cout.setf(0, ios_base::showbase); // не показывать базу
cout << 32 << endl; // 20
return 0;
}
40.2.1.2. Состояния
В классе
ios_base
определен тип
iostate
, который является сино-
нимом вложенного типа
T2
, зависимого от реализации класса и
определяющего битовую маску исключений:
typedef T2 iostate;
В классе
ios_base
определены следующие флаги, которые отме-
чают состояние потока и могут быть установлены в этой битовой
маске:
static const iostate badbit, eofbit, failbit, goodbit;
Эти флаги отмечают следующие состояния потока:
badbit
— нарушение целостности буфера потока;
eofbit
— обнаружен конец файла при вводе из потока;
failbit
— возникла ошибка при вводе данных из потока;
goodbit
— не установлены никакие флаги.
Глава 40. Потоки ввода/вывода в C++
463
40.2.1.3. Режимы открытия потока
В классе
ios_base
определен тип
openmode
:
typedef T3 openmode;
Тип является синонимом вложенного типа
T3
, зависимого от реа-
лизации класса и определяющего битовую маску с режимами от-
крытия потока. В классе
ios_base
определены следующие флаги,
которые управляют режимами открытия потока и могут быть ус-
тановлены в этой битовой маске:
static const openmode app, ate, binary, in, out, trunc;
Эти флаги имеют следующее назначение:
app
— каждая операция вывода записывает данные в конец
потока;
ate
— открытие потока и установка индикатора позиции на
его конец;
binary
— открытие потока в бинарном режиме;
in
— открытие потока для чтения данных;
out
— открытие потока для записи данных;
trunc
— открытие потока и стирание информации из файла,
с которым связывается этот поток.
Использование этих флагов будет показано в дальнейшем при
создании и открытии файлов.
40.2.1.4. Направления поиска
В классе
ios_base
определен тип
seekdir
:
typedef T4 seekdir;
Тип является синонимом вложенного типа
T4
, определяющего
перечисление и используемого для определения направления по-
иска позиции в потоке. В классе
ios_base
определены следующие
флаги, которые управляют направлением поиска позиции:
static const seekdir beg, cur, end;
Часть IV. Стандартная библиотека языка программирования С++
464
Эти флаги имеют следующее назначение:
beg
— поиск позиции, начиная от начала потока;
cur
— поиск позиции, начиная от текущей позиции;
end
— поиск позиции, начиная от конца потока.
Использование этих флагов будет показано в дальнейшем при
установке индикатора позиции потока.
40.2.1.5. События
В классе
ios_base
определен тип
event
:
typedef T5 event;
Тип является синонимом вложенного типа
T5
, определяющего
перечисление и используемого для определения событий, могут
быть переданы как аргументы
функциям обратного вызова
(callback functions). В классе
ios_base
определены следующие
события:
static const event copyfmt_event, erase_event,
imbue_event;
Эти события имеют следующее назначение:
copyfmt_event
— событие, возникающее при исполнении
функции
copyfmt
— члене шаблона класса
basic_ios
перед ко-
пированием маски исключений потока;
erase_event
— событие, которое может возникнуть или в на-
чале исполнения функции
copyfmt
— члене шаблона класса
basic_ios
, или в начале исполнения деструктора для объекта
*this
;
imbue_event
— событие, возникающее при исполнении функ-
ции
imbue
— члене класса
ios_base
перед выходом из этой
функции.
Когда происходит одно из этих событий, вызываются функции
обратного вызова, адреса которых хранятся в стеке функций об-
ратного вызова. Вызов функций обратного вызова происходит
в порядке, обратном порядку записи их адресов в стек.
Глава 40. Потоки ввода/вывода в C++
465
Функция обратного вызова имеет тип
event_callback
, который
определен следующим образом:
typedef void (*event_callback)(
event ev, ios_base& ios, int idx);
Здесь параметры
ev
и
ios
задают соответственно событие и по-
ток, в котором возникает это событие, а параметр
idx
задает ин-
декс, с которым регистрируется функция обратного вызова.
Для регистрации функций обратного вызова предназначена
функция
register_callback
— член класса
ios_base
, которая име-
ет следующий прототип:
void register_callback(event_callback pfn, int idx);
Здесь параметр
pfn
задает адрес функции обратного вызова, а па-
раметр
idx
задает индекс, который передается функции обратного
вызова как аргумент.
В листинге 40.2 приведен пример регистрации и вызова функции
обратного вызова.
Листинг 40.2. Регистрация и вызов функции обратного вызова
#include <locale>
#include <iostream>
using namespace std;
void f(ios::event ev, ios_base& ios, int idx)
{
cout << "event: " << ev << endl;
cout << "index: " << idx << endl;
}
int main()
{
cout.register_callback(f, 10);
cout.imbue(locale("")); // event: 1 index: 10
cout << 12.5 << endl; // 12,5
return 0;
}