Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

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


background image

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

) члены это-

го шаблона класса. 


background image

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


background image

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


background image

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

, т. е. конец строки. 


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