Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4100

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 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


background image

Часть 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

 — не установлены никакие флаги. 


background image

Глава 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; 


background image

Часть 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

  перед  выходом  из  этой 

функции. 

Когда  происходит  одно  из  этих  событий,  вызываются  функции 
обратного вызова, адреса которых хранятся в стеке функций об-
ратного  вызова.  Вызов  функций  обратного  вызова  происходит  
в порядке, обратном порядку записи их адресов в стек. 


background image

Глава 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; 


Смотрите также файлы