Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

Глава 40. Потоки ввода/вывода в C++ 

481 

го в символьное. Для форматированного вывода в поток данных 
разных типов в шаблоне класса 

basic_ostream<E, T>

 перегружены 

следующие операторы: 

  basic_ostream& operator<<(bool n); 
  basic_ostream& operator<<(short n); 
  basic_ostream& operator<<(unsigned short n); 
  basic_ostream& operator<<(int n); 
  basic_ostream& operator<<(unsigned int n); 
  basic_ostream& operator<<(long n); 
  basic_ostream& operator<<(unsigned long n); 
  basic_ostream& operator<<(float n); 
  basic_ostream& operator<<(double n); 
  basic_ostream& operator<<(long double n); 
  basic_ostream& operator<<(const void *n); 

Все эти операторы уже неоднократно использовались для вывода 
в стандартный поток вывода 

cout

 различных данных. 

Также оператор 

<<

  перегружен  для  вывода  в  поток  содержимого 

буфера: 

  basic_ostream& operator<<(basic_streambuf<E, T> *sb); 

Данные из буфера выводятся в поток до тех пор, пока не выпол-
нится одно из следующих условий: 

 

в буфере встретился символ конца файла; 

 

запись символа в поток завершилась неудачно; 

 

при извлечении символа из буфера произошло исключение. 

Если в поток не выведено ни одного символа или при извлечении 
символа  из  буфера  произошло  исключение,  то  оператор  вывода 
вызывает  функцию 

setstate(failbit)

,  наследуемую  от  шаблон-

ного класса 

basic_ios<E, T>

. В последнем случае также повторно 

выбрасывает обрабатываемое исключение. 
Если указатель на буфер пустой, то оператор вызывает функцию 

setstate(badbit)

Кроме  того,  в  шаблоне  класса 

basic_ostream<E, T>

  перегружены 

следующие операторы 

<<


background image

Часть IV. Стандартная библиотека языка программирования С++ 

482 

  basic_ostream& operator<<(ios_base& (*pf)(ios_base&)); 
  basic_ostream& operator<<( 
      basic_ios<E, T>& (*pf)(basic_ios<E, T>&)); 
  basic_ostream& operator<<( 
      basic_ostream& (*pf)(basic_ostream&)); 

Они  обеспечивают  правильную  обработку  манипуляторов  пото-
ков  типа 

ios_base

basic_ios<E, T>

  и 

basic_ostream<E, T>

  соот-

ветственно. 
Все перегруженные операторы 

<<

 возвращают значение 

*this

40.3.1.5. Вывод символа 

Для  неформатированного  вывода  в  поток  символа  (байтов)  в 
шаблоне класса 

basic_ostream<E, T>

 определена функция 

put

  basic_ostream& put(char_type c); 

Пример использования функции 

put

 приведен в листинге 40.5. 

40.3.1.6. Вывод блока памяти 

Для неформатированного вывода в поток блока памяти в шабло-
не класса 

basic_ostream<E, T>

 определена функция 

write

  basic_ostream& write(char_type *s, streamsize n); 

Здесь  параметр 

s

  содержит  адрес  блока  памяти,  который  будет 

выводиться в поток, а параметр 

n

  задает длину  блока,  т. е. коли-

чество  выводимых  в  поток  элементов.  Заметим,  что  при  выводе 
данные не форматируются, т. е. в поток записывается копия бло-
ка памяти. 
Функция 

write

 возвращает значение 

*this

Пример использования функции 

write

 приведен в листинге 40.13, 

в котором показано, как создавать бинарные файлы. 

40.3.1.7. Освобождение буфера потока 

Для освобождения буфера, связанного с потоком вывода, в шаб-
лоне класса 

basic_ostream<E, T>

 определена функция 

flush

  basic_ostream& flush(); 


background image

Глава 40. Потоки ввода/вывода в C++ 

483 

Освобождение  буфера  заключается  в  выводе  данных  из  буфера, 

связанного с потоком вывода в этот поток. 
Функция 

flush

 работает следующим образом. Сначала вызывает-

ся  функция 

rdbuf()

.  Если  эта  функция  вернула  не  пустой  указа-

тель,  то  вызывается  функция 

rdbuf()->pubsync()

.  Если  функция 

rdbuf

 

вернула  значение 

-1

,  то  вызывается  функция 

setstate(badbit)

. Функция возвращает значение 

*this

В  листинге  40.4  показан  пример  освобождения  буфера  потока 

вывода при выводе данных в файл. 

40.3.1.8. Управление индикатором позиции 

Для  управления  индикатором  позиции  в  шаблоне  класса 

basic_ostream<E, T>

 

определены следующие функции: 

  pos_type tellp(); 
  basic_ostream& seekp(pos_type pos); 
  basic_ostream& seekp(off_type off, ios_base::seek_dir dir); 

Функция 

tellp

  читает,  а функции 

seekp

  устанавливают  значение 

индикатора  позиции  для  дальнейшей  записи  данных  в  поток 

функциями неформатного вывода. 
Функция 

tellp

 работает следующим образом. Сначала вызывает-

ся функция 

fail()

. Если эта функция вернула значение 

false

, то 

функция 

tellp

 возвращает значение 

rdbuf()->pubseekoff(0, cur, 

out)

, иначе — значение 

pos_type(-1)

Функции 

seekp

  работают  следующим  образом.  Сначала  вызыва-

ется функция 

fail()

. Если эта функция вернула значение 

false

, то 

первая функция 

seekp

 вызывает функцию 

rdbuf()->pubseekpos(pos)

а  вторая —  функцию 

rdbuf()->pubseekoff(off, dir)

.  Обе  функ-

ции 

seekp

 возвращают значение 

*this

Пример работы функций 

tellp

 и 

seekp

 приведен в листинге 40.4. 

Листинг 40.4. Пример освобождения буфера потока  

и работы с индикатором позиции файла 

#include <iostream> 
#include <fstream> 
using namespace std; 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

484 

int main() 

  ostream::pos_type i; 
  ofstream out("test.txt"); 
 
  out << "---"; 
  i = out.tellp();  // запоминаем индикатор позиции 
  out << ' ' << "---"; 
  out.flush();      // сбрасываем данные в файл 
 
  cout << "Press any key to continue" << endl; 
  cin.get();        // можно посмотреть файл 
 
  out.seekp(i);     // устанавливаем индикатор позиции 
  out.put('+'); 
  out.close(); 
 
  return 0; 

40.3.1.9. Класс 

sentry

 

В  шаблоне  класса 

basic_ostream<E, T>

  определен  вложенный 

класс 

sentry

  class sentry 
  { 
  public: 
    explicit sentry(basic_ostream<E, T>& os); 
    operator bool() const; 
  }; 

Класс 

sentry

 служит для объявления объектов, создание которых 

подготавливает  поток,  заданный  параметром 

os

  конструктора, 

для форматированного и неформатированного вывода. После за-
вершения работы конструктора вызов оператора преобразования 
типа 

bool

  возвращает  значение 

true

,  если  значение 

os.good()

 

также равно 

true

, иначе — значение 

false


background image

Глава 40. Потоки ввода/вывода в C++ 

485 

40.3.2. Манипуляторы 

В заголовочном файле ostream определены следующие шаблоны 
манипуляторов шаблонного класса 

basic_ostream<E, T>

  template class<E, T> 
    basic_ostream<E, T>& endl(basic_ostream<E, T>& os); 
  template class<E, T> 
    basic_ostream<E, T>& ends(basic_ostream<E, T>& os); 
  template class<E, T> 
    basic_ostream<E, T>& flush(basic_ostream<E, T>& os); 

Манипулятор 

endl

  выводит  в  поток,  заданный  параметром 

os

символ перехода на новую строку 

\n

, а затем освобождает буфер 

потока, вызывая функцию 

os.flush()

Манипулятор 

ends

  выводит  в  поток,  заданный  параметром 

os

пустой символ 

\0

Манипулятор 

flush

  освобождает  буфер  потока,  вызывая  функ-

цию 

os.flush()

Все манипуляторы возвращают поток, заданный параметром 

os

40.3.3. Перегруженный шаблон  

оператора вывода 

<<

 

В заголовочном файле ostream перегружены

 

следующие шабло-

ны оператора 

<<

  template<class E, class T> basic_ostream<E, T>& 
    operator<<(basic_ostream<E, T>& os, E c); 
  template<class E, class T> basic_ostream<E, T>& 
    operator<<(basic_ostream<E, T>& os, char c); 
  template<class T> basic_ostream<char, T>& operator<< 
    (basic_ostream<char, T>& os, char c); 
  template<class T> basic_ostream<char, T>& operator<<( 
    basic_ostream<char, T>& os, signed char c); 
  template<class T> basic_ostream<char, T>& operator<<( 
    basic_ostream<char, T>& os, unsigned char c); 

Соответствующие шаблонные операторы выводят в поток, задан-
ный параметром 

os

, символ, заданный параметром 

c


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