ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4235
Скачиваний: 28
Глава 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>
перегружены
следующие операторы
<<
:
Часть 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();
Глава 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;
Часть 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
.
Глава 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
.