ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4238
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
476
streamoff operator-(const fpos& rhs) const;
fpos operator-(streamoff off) const;
fpos operator+(streamoff off) const;
bool operator==(const fpos& rhs) const;
bool operator!=(const fpos& rhs) const;
};
Этот шаблон класса предназначен для определения индикаторов
позиции файла. Параметр
St
шаблона класса
fops
задает тип объ-
екта, который хранит состояние строки длинных (multibyte) сим-
волов, которая хранится в буфере потока.
Объекты класса
fops<St>
содержат, по крайней мере, два объекта:
объект типа
streamoff
, который задает смещение в байтах, и объ-
ект типа
St
.
Конструкторы шаблонного класса
fops<St>
выполняют следую-
щие действия:
первый конструктор устанавливает начальное смещение рав-
ным значению, заданному параметром
off
, и инициализирует
объект-член типа
St
; начальное смещение равное
-1
считается
неправильным;
второй конструктор устанавливает начальное значение рав-
ным нулю и инициализирует объект-член типа
St
значением,
заданным параметром
state
.
Для работы с состоянием строки длинных (multibyte) символов
предназначены функции
state
, которые выполняют следующие
действия:
первая функция
state
возвращает состояние строки длинных
символов, хранящееся в индикаторе позиции;
вторая функция
state
устанавливает в индикаторе позиции
состояние строки длинных символов, заданное параметром
state
.
Операторы, перегруженные в шаблоне класса
fops<St>
, имеют
следующее назначение:
streamoff
— возвращает смещение, хранимое в индикаторе
позиции;
Глава 40. Потоки ввода/вывода в C++
477
-=
— вычитает из смещения, хранимого в текущем объекте,
значение параметра
off
;
+=
— прибавляет к смещению, хранимому в текущем объекте,
значение параметра
off
;
-
— первый оператор возвращает разность между смещения-
ми, хранящимися в текущем объекте и в объекте, заданном
параметром
rhs
; второй оператор возвращает объект
fops(*this)-=off
;
+
— возвращает объект
fops(*this)+=off
;
==
— возвращает значение
true
, если текущий объект равен
объекту, заданному параметром
rhs
, иначе — значение
false
;
!=
— возвращает значение
true
, если текущий объект не равен
объекту, заданному параметром
rhs
, иначе — значение
false
.
Для специализации
fpos<mbstate_t>
шаблона класса объявлены
типы синонимы
streampos
и
wstreampos
, которые предназначены
для работы с потоками типов
ios
и
wios
соответственно.
Здесь
mbstate_t
— синоним некоторого типа, который использу-
ется для представления состояния строки длинных символов.
40.2.4. Манипуляторы
Манипулятор
— это функция, которая изменяет поток. В заголо-
вочном файле ios определены следующие манипуляторы, кото-
рые устанавливают флаги, хранимые в потоке, заданном пара-
метром
str
:
ios_base& boolalpha(ios_base& str);
— флаг
boolalpha
ios_base& dec(ios_base& str);
— флаг
dec
ios_base& fixed(ios_base& str);
— флаг
fixed
ios_base& hex(ios_base& str);
— флаг
hex
ios_base& internal(ios_base& str);
— флаг
internal
ios_base& left(ios_base& str);
— флаг
left
ios_base& oct(ios_base& str);
— флаг
oct
ios_base& right(ios_base& str);
— флаг
right
Часть IV. Стандартная библиотека языка программирования С++
478
ios_base& scientific(ios_base& str);
— флаг
scientific
ios_base& showbase(ios_base& str);
— флаг
showbase
ios_base& showpoint(ios_base& str);
— флаг
showpoint
ios_base& showpos(ios_base& str);
— флаг
showpos
ios_base& skipws(ios_base& str);
— флаг
skipws
ios_base& unitbuf(ios_base& str);
— флаг
unitbuf
ios_base& uppercase(ios_base& str);
— флаг
uppercase
Кроме того, в заголовочном файле ios определены следующие
манипуляторы, которые сбрасывают флаги, хранимые в потоке,
заданном параметром
str
:
ios_base& noboolalpha(ios_base& str);
— флаг
boolalpha
ios_base& noshowbase(ios_base& str);
— флаг
showbase
ios_base& noshowpoint(ios_base& str);
— флаг
showpoint
ios_base& noskipws(ios_base& str);
— флаг
skipws
ios_base& nounitbuf(ios_base& str);
— флаг
unitbuf
ios_base& nouppercase(ios_base& str);
— флаг
uppercase
В листинге 40.3 показан пример изменения состояния флагов по-
тока при помощи манипуляторов. Сравнение с листингом 40.1
показывает, что состояние флага удобнее изменять манипу-
лятором, чем функциями
setf
и
unsetf
, рассмотренными в
разд. 40.2.1.3
.
Листинг 40.3. Пример использования манипуляторов
#include <iostream>
using namespace std;
int main()
{
cout << boolalpha << false << endl; // false
cout << hex << showbase << 32 << endl; // 0x20
cout << noshowbase << 32 << endl; // 20
return 0;
}
Глава 40. Потоки ввода/вывода в C++
479
40.3. Базовые потоки вывода
<ostream>
В заголовочном файле ostream определен шаблон класса
basic_ostream<E, T>
, который определяет базовые классы для по-
токов вывода, а также типы — синонимы специализаций этого
шаблона:
namespace std
{
template<class E, class T = char_traits<E>>
class basic_ostream;
typedef basic_ostream<char, char_traits<char>>
ostream;
typedef basic_ostream<wchar_t, char_traits<wchar_t>>
wostream;
}
Кроме того, в заголовочном файле ostream перегружены шаблоны
оператора
<<
для форматированного вывода символов и строк
языка программирования C, а также определены шаблоны мани-
пуляторов
endl
,
ends
и
flush
, работающих с выходными потока-
ми.
40.3.1. Шаблон класса
basic_ostream
Шаблон класса определяется как
virtal
и
public
наследник шаб-
лона класса
basic_ios<E, T>
:
template<class E, class T = char_traits<E>>
class basic_ostream;
Этот шаблон предназначен для создания шаблонных классов по-
токов вывода.
Параметр
E
шаблона задает тип символов, которые являются эле-
ментами потока, а параметр
T
определяет характеристики этих
символов. Подробно характеристики символов описаны в
разд. 39.1
.
Часть IV. Стандартная библиотека языка программирования С++
480
В этом разделе описаны все ассоциированные с классом
basic_ostream<E, T>
типы, а также открытые (public) члены этого
шаблона класса.
40.3.1.1. Ассоциированные типы
В шаблоне класса
basic_ostream<E, T>
определены следующие
типы, которые определяются аргументами шаблона:
typedef typename basic_ios<E, T>::char_type char_type;
typedef typename basic_ios<E, T>::traits_type traits_type;
typedef typename basic_ios<E, T>::int_type int_type;
typedef typename basic_ios<E, T>::pos_type pos_type;
typedef typename basic_ios<E, T>::off_type off_type;
Отсюда видно, что эти типы являются синонимами соответст-
вующих типов, определенных в шаблоне класса
basic_ios<E, T>
и описанных в
разд. 40.2.2.1
.
40.3.1.2. Конструктор
В шаблоне класса
basic_ostream<E, T>
определен конструктор:
explicit basic_ostream(basic_streambuf<E, T> *sb);
Параметр
sb
этого конструктора задает буфер потока вывода.
Этот конструктор вызывает защищенную функцию
init(sb)
, ко-
торая наследуется от класса
basic_ios<E, T>
и инициализирует
поток.
40.3.1.3. Деструктор
В шаблоне класса
basic_ostream<E, T>
определен
деструктор,
который разрушает выходной поток, не выполняя при этом ника-
ких операций над буфером потока:
virtual ~ostream();
,
40.3.1.4. Перегруженный оператор вывода
<<
Вывод данных из памяти в поток называется форматированным,
если при выводе представление данных преобразуется из битово-