ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4234
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
486
Также в заголовочном файле ostream перегружены
следующие
шаблоны оператора
<<
:
template<class E, class T> basic_ostream<E, T>&
operator<<(basic_ostream<E, T>& os, const E *s);
template<class E, class T> basic_ostream<E, T>&
operator<<(basic_ostream<E, T>& os, const char *s);
template<class T> basic_ostream<char, T>& operator<<
(basic_ostream<char, T>& os, const char *s);
template<class T> basic_ostream<char, T>& operator<<(
basic_ostream<char, T>& os, const signed char *s);
template<class T> basic_ostream<char, T>& operator<<(
basic_ostream<char, T>& os, const unsigned char *s);
Соответствующие шаблонные операторы выводят в поток, задан-
ный параметром
os
, строку языка программирования C, заданную
параметром
s
.
Если ширина поля вывода потока больше чем длина выводимых
данных, то свободные позиции заполняются символом заполни-
телем, который задан в потоке. После завершения вывода каждый
шаблонный оператор
<<
устанавливает ширину поля вывода рав-
ной нулю.
40.4. Базовые потоки ввода
и ввода/вывода <istream>
В заголовочном файле istream определены следующие шаблоны
классов и типы — синонимы специализаций этих шаблонов:
namespace std
{
template<class E, class T = char_traits<E>>
class basic_istream;
typedef basic_istream<char, char_traits<char>> istream;
typedef basic_istream<wchar_t, char_traits<wchar_t>>
wistream;
template<class E, class T = char_traits<E>>
class basic_iostream;
Глава 40. Потоки ввода/вывода в C++
487
typedef basic_iostream<char, char_traits<char>> iostream;
typedef basic_iostream<wchar_t, char_traits<wchar_t>>
wiostream;
}
Шаблон класса
basic_istream<E, T>
предназначен для определе-
ния базовых потоков ввода, а типы
istream
и
wistream
являются
синонимами специализаций этого шаблона класса и предназначе-
ны для определения базовых потоков ввода, работающих с сим-
волами типа
char
и
wchar_t
соответственно.
Шаблон класса
basic_iostream<E, T>
предназначен для определе-
ния базовых потоков ввода/вывода, а типы
iostream
и
wiostream
являются синонимами специализаций этого шаблона класса и
предназначены для определения базовых потоков ввода, рабо-
тающих с символами типа
char
и
wchar_t
соответственно.
Кроме того, в заголовочном файле istream перегружены шаблоны
оператора
>>
для форматированного ввода символов и слов, а
также определен шаблон манипулятора
ws
, работающего с вход-
ными потоками.
40.4.1. Шаблон класса
basic_istream
Шаблон класса определяется как
virtal
и
public
наследник шаб-
лона класса
basic_ios<E, T>
:
template <class E, class T = char_traits<E>>
class basic_istream;
Этот шаблон предназначен для создания шаблонных классов по-
токов ввода.
Параметр
E
шаблона задает тип символов, которые являются эле-
ментами потока, а параметр
T
определяет характеристики этих
символов. Подробно характеристики символов описаны в
разд. 39.1
.
В этом разделе описаны все ассоциированные с классом
basic_istream<E, T>
типы, а также открытые (
public
) члены это-
го шаблона класса.
Часть IV. Стандартная библиотека языка программирования С++
488
40.4.1.1. Ассоциированные типы
В шаблоне класса
basic_istream<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.4.1.2. Конструктор
В шаблоне класса
basic_istream<E, T>
определен конструктор:
explicit basic_istream(basic_streambuf<E, T> *sb);
Параметр
sb
этого конструктора задает буфер потока ввода. Этот
конструктор вызывает защищенную функцию
init(sb)
, которая
наследуется от класса
basic_ios<E, T>
и инициализирует поток.
40.4.1.3. Деструктор
В шаблоне класса
basic_istream<E, T>
определен деструктор, ко-
торый разрушает входной поток, не выполняя при этом никаких
операций над буфером потока:
virtual ~istream();
40.4.1.4. Перегруженный оператор ввода
>>
Ввод данных из потока в память называется форматированным,
если при вводе представление данных преобразуется из символь-
ного в битовое. Для форматированного ввода из потока данных
разных типов в шаблоне класса
basic_istream<E, T>
перегружены
следующие операторы
>>
:
basic_istream& operator>>(bool& n);
basic_istream& operator>>(short& n);
basic_istream& operator>>(unsigned short& n);
Глава 40. Потоки ввода/вывода в C++
489
basic_istream& operator>>(int& n);
basic_istream& operator>>(unsigned int& n);
basic_istream& operator>>(long& n);
basic_istream& operator>>(unsigned long& n);
basic_istream& operator>>(void *& n);
basic_istream& operator>>(float& n);
basic_istream& operator>>(double& n);
basic_istream& operator>>(long double& n);
Все эти операторы уже неоднократно использовались для ввода
различных данных из стандартного потока ввода
cin
.
Также оператор
>>
перегружен для ввода данных из потока в
буфер:
basic_istream& operator>>(basic_streambuf<E, T> *sb);
Данные в буфер вводятся в поток до тех пор, пока не выполнится
одно из следующих условий:
в потоке встретился символ конца файла;
запись символа в буфер завершилась неудачно;
при записи символа в буфер произошло исключение.
Если из потока не введено ни одного символа, то оператор ввода
вызывает функцию
setstate(failbit)
, наследуемую от шаблон-
ного класса
basic_ios<E, T>
.
Если указатель на буфер пустой, то оператор вызывает функцию
setstate(failbit)
.
Кроме того, в шаблоне класса
basic_istream<E, T>
перегружены
следующие операторы
>>
:
basic_istream& operator>>(ios_base& (*pf)(ios_base&));
basic_istream& operator>>(
basic_ios<E, T>& (*pf)(basic_ios<E, T>&));
basic_istream& operator>>(
basic_istream& (*pf)(basic_istream&));
Эти операторы обеспечивают правильную обработку мани-
пуляторов
потоков
типа
ios_base
,
basic_ios<E, T>
и
basic_istream<E, T>
соответственно.
Все перегруженные операторы
>>
возвращают значение
*this
.
Часть IV. Стандартная библиотека языка программирования С++
490
40.4.1.5. Ввод символов
Для неформатированного ввода из потока символа (байта) в шаб-
лоне класса
basic_ostream<E, T>
перегружены следующие функ-
ции
get
:
int_type get();
basic_istream& get(char_type& c);
Первая функция
get
возвращает введенный из потока символ.
Если символы в потоке закончились, то функция возвращает зна-
чение
traits_type::eof()
.
Вторая функция
get
записывает введенный из потока символ в
параметр
c
. Если символы в потоке закончились, то в параметр
c
записывается значение
traits_type::eof()
. После этого функция
возвращает значение
*this
.
Для неформатированного ввода из потока последовательности
символов (байтов) в шаблоне
basic_ostream<E, T>
перегружены
следующие
функции
get
:
basic_istream& get(char_type *s, streamsize n);
basic_istream& get(char_type *s, streamsize n,
char_type delim);
Обе эти перегруженные функции
get
вводят символы из текуще-
го потока и записывают их последовательно в массив, адрес ко-
торого задан параметром
s
.
При этом первая функция
get
вводит из потока символы до тех
пор, пока не выполнится одно из следующих условий:
встретился конец файла;
встретился символ перехода на новую строку
\n
;
введено
n-1
символов.
Вторая функция
get
работает аналогично первой, но символ, от-
мечающий конец ввода, задается параметром
delim
.
Обе функции оставляют в потоке символ, отмечающий конец
ввода, и после встречи этого символа записывают в конец масси-
ва символ
char_type()
, т. е. конец строки.