ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4245
Скачиваний: 28
Г Л А В А
40
Потоки ввода/вывода
в C++
40.1. Структура
стандартной библиотеки ввода/вывода
Как уже говорилось в
разд. 30.1
,
потоком
называется логический
или, другими словами, программный интерфейс, который обес-
печивает доступ к файлу. В языке программирования C++ потоки
ввода/вывода представляются объектами шаблонных классов.
Сами шаблоны потоков определены в стандартной библиотеке
ввода/вывода языка программирования C++, которая организова-
на как иерархия шаблонов классов.
В стандартной библиотеке определены два множества шаблон-
ных классов этой иерархии: одно для работы с символами типа
char
, другое для работы с символами типа
wchar_t
. Классы для
работы с символами типа
char
имеют синонимы, имена которых
соответствуют именам шаблонов классов, но не содержат слова
basic
и символа
_
. Например, для шаблонного класса
basic_
istream<char>
определен тип-синоним
istream
. Шаблонные клас-
сы для работы с символами типа
wchar_t
имеют те же имена, что
и классы для работы с символами типа
char
, но с префиксом
w
.
Например, для шаблонного класса
basic_istream<wchar>
опреде-
лен тип-синоним
wistream
.
Ниже перечислены заголовочные файлы, а также классы и шаб-
лоны классов из стандартной библиотеки ввода/вывода, которые
определены в этих файлах:
Глава 40. Потоки ввода/вывода в C++
457
ios
— класс
ios_base
, шаблон класса
basic_ios
;
ostream
— шаблон класса
basic_ostream
;
istream
— шаблоны классов
basic_istream
и
basic_iostream
;
iostream
— стандартные потоки
cin
,
cout
,
cerr
,
clog
и
wcin
,
wcout
,
wcerr
,
wclog
;
fstream
— шаблоны классов
basic_filebuf
,
basic_ifstream
,
basic_ofstream
и
basic_fstream
;
strstream
— классы
strstreambuf
,
istrstream
,
ostrstream
и
strstream
;
sstream
— шаблоны классов
basic_stringbuf
,
basic_
istringstream
,
basic_ostringstream
и
basic_stringstream
;
streambuf
— шаблон класса
basic_streambuf
.
Рис. 40.1.
Иерархия шаблонов классов стандартной библиотеки ввода/вывода
В следующих разделах все классы и шаблоны классов, опреде-
ленные в стандартной библиотеке ввода/вывода, будут рассмот-
рены подробно.
Часть IV. Стандартная библиотека языка программирования С++
458
40.2. Базовые классы потоков <ios>
В заголовочном файле ios определены следующие классы, шаб-
лоны классов и типы:
namespace std
{
typedef T1 streamoff;
typedef T2 streamsize;
class ios_base;
template <class E, class T = char_traits<E>>
class basic_ios;
typedef basic_ios<char, char_traits<char>> ios;
typedef basic_ios<wchar_t, char_traits<wchar_t>> wios;
template <class St> class fpos;
typedef fpos<mbstate_t> streampos;
typedef fpos<mbstate_t> wstreampos;
}
Тип
streamoff
является синонимом некоторого целочисленного
типа
T1
, который зависит от реализации и имеет длину, по край-
ней мере, 32 бита. Этот тип используется для представления
смещения в операциях с индикаторами позиции потока. Этот тип
не гарантирует представление любого смещения. Для обозначе-
ния неправильного смещения обычно используется значение
streamoff(-1)
.
Тип
streamsize
является синонимом некоторого целочисленного
типа
T2
, который зависит от реализации и имеет длину, по край-
ней мере, 16 бит. Этот тип используется для представления дли-
ны в функциях-членах потоков. Этот тип не гарантирует пред-
ставление любой длины.
В классе
ios_base
определены методы, которые являются общими
для входных и выходных потоков и, кроме того, не зависят от
параметров шаблонов.
В классе шаблоне класса
basic_ios
определены методы, которые
также являются общими для входных и выходных потоков, но
зависимы от параметров шаблонов.
Глава 40. Потоки ввода/вывода в C++
459
Для специализаций
basic_ios<char
,
char_traits<char>>
и
basic_ios<wchar_t
,
char_traits<wchar_t>>
шаблонного класса
basic_ios
объявлены типы синонимы
ios
и
wios
, которые опреде-
ляют базовые потоки ввода/вывода для работы с символами ти-
пов
char
и
wchar_t
соответственно.
Шаблон класса
fpos
определяет индикатор позиции потока. Для
специализации
fpos<mbstate_t>
этого шаблона класса объявлены
типы синонимы
streampos
и
wstreampos
, которые предназначены
для работы с потоками типов
ios
и
wios
соответственно.
Кроме того, в заголовочном файле ios объявлены функции не
члены классов, которые изменяют состояние потока. Такие функ-
ции называются
манипуляторами
.
Все эти классы и функции будут подробно рассмотрены
ниже.
40.2.1. Класс
ios_base
Объекты типа
ios_base
поддерживают следующую информацию
о состоянии потока:
флаги форматирования в объекте типа
fmtflags
;
ширину поля ввода/вывода в объекте типа
int
;
разрешение дисплея в объекте типа
int
;
маску исключений в объекте типа
iostate
;
стек вызовов
callback
функций при наступлении событий типа
event
;
внутренний расширяемый массив с элементами типа
long
;
внутренний расширяемый массив с элементами типа
void*
;
объект типа
locale
, в котором хранится информация о локаль-
ности.
В этом разделе описаны все определенные в классе
ios_base
ти-
пы, открытые (
public
) члены этого класса, а также конструктор
этого класса, который является защищенным (
protected
) членом.
Часть IV. Стандартная библиотека языка программирования С++
460
40.2.1.1. Флаги
В классе
ios_base
определен тип
fmtflags
, который является си-
нонимом вложенного типа
T1
, зависимого от реализации класса и
определяющего битовую маску:
typedef T1 fmtflags;
В классе
ios_base
определены следующие флаги, которые управ-
ляют режимами работы потока и могут быть установлены в этой
битовой маске:
static const fmtflags boolalpha, dec, fixed, hex,
internal, left, oct, right, scientific,
showbase, showpoint, showpos, skipws, unitbuf,
uppercase, adjustfield, basefield, floatfield;
Эти флаги имеют следующее назначение:
boolalpha
— ввод/вывод булевых данных в текстовом фор-
мате;
dec
— ввод/вывод целочисленных данных в десятичном фор-
мате;
fixed
— ввод/вывод чисел с плавающей точкой в формате
с точкой и без экспоненты;
hex
— ввод/вывод целочисленных данных в шестнадцатерич-
ном формате;
internal
— вставка символа заполнителя внутрь поля вывода
до достижения нужной ширины этого поля;
left
— вставка символа заполнителя в конец поля вывода до
достижения нужной ширины этого поля;
oct
— ввод/вывод целочисленных данных в восьмеричном
формате;
right
— вставка символа заполнителя в начало поля вывода до
достижения нужной ширины этого поля;
scientific
— ввод/вывод чисел с плавающей точкой в форма-
те с точкой и экспонентой;
showbase
— вывод перед целочисленным числом префикса,
который указывает систему счисления;