Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Функция

make_pair
упрощает использование пар. Например, рассмотрим схему функции, возвращающей значение и индикатор ошибки.

pair<double,error_indicator> my_fct(double d)

{

errno = 0; // очищаем индикатор ошибок в стиле языка C

// выполняем много вычислений, связанных с переменной d,

// и вычисляем x

error_indicator ee = errno;

errno = 0; //
очищаем индикатор ошибок в стиле языка C

return make_pair(x,ee);

}

Этот пример является полезной идиомой. Его можно использовать следующим образом:

pair<int,error_indicator> res = my_fct(123.456);

if (res.second==0) {

// используем res.first

}

else {

// Ой: ошибка

}

Б.7. Потоки ввода-вывода

Библиотека потоков ввода-вывода содержит средства форматированного и неформатированного буферизованного ввода-вывода текста и числовых значений.

Определения потоков ввода-вывода находятся в заголовках

<istream>
,
<ostream>
и т.п. (см. раздел Б.1.1).

Объект класса

ostream
преобразовывает объекты, имеющие тип, в поток символов (байтов).

Объект класса

istream
преобразовывает поток символов (байтов) в объекты, имеющие тип.

Объект класса

iostream
это поток, который может действовать и как объект класса
istream
, и как объект класса
ostream
. Буфера, изображенные на диаграмме, являются потоковыми буферами (
streambuf
). Если читателям потребуется перейти от потоков класса
iostream
к новым видам устройств, файлов или памяти, они смогут найти их описание в профессиональных учебниках.

Существуют три стандартных потока.

Б.7.1. Иерархия потоков ввода-вывода

Поток

istream
можно связать с устройством ввода (например, клавиатурой), файлом или объектом класса
string
. Аналогично поток
ostream
можно связать с устройством вывода (например, текстовым окном), файлом или объектом класса
string
. Потоки ввода-вывода образуют иерархию классов.

Поток

можно открыть либо с помощью конструктора, либо вызова функции
open
.

Для файловых потоков имя файлов представляет собой строку в стиле языка С.

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

В каждом из этих режимов открытие файла может зависеть от операционной системы и ее возможностей учесть требование программиста открыть файл именно так, а не иначе. В результате поток может не оказаться в состоянии

good
. Рассмотрим пример.

void my_code(ostream& os); // функция my_code может использовать

// любой поток вывода

ostringstream os; // буква "o" означает "для вывода"

ofstream of("my_file");

if (!of) error("невозможно открыть 'my_file' для записи");

my_code(os); // используется объект класса string

my_code(of); // используется файл

См. раздел 11.3.

Б.7.2. Обработка ошибок

Поток

iostream
может пребывать в одном из четырех состояний.

Используя функцию

s.exceptions
, программист может потребовать, чтобы поток
iostream
сгенерировал исключение, если из состояния
good
он перешел в другое состояние (см. раздел 10.6).

Любая операция, в результате которой поток не находится в состоянии

good
, не имеет никакого эффекта; такая ситуация называется “no op”.

Объект класса

iostream
можно использовать как условие. В данном случае условие является истинным (успех), если поток
iostream
находится в состоянии
good
. Это обстоятельство стало основой для распространенной идиомы, предназначенной для считывания потока значений.

X x; // "буфер ввода" для хранения одного значения типа X

while (cin>>x) {

// какие-то действия с объектом x

}

// мы окажемся в этой точке, если оператор >> не сможет прочитать

// очередной объект класса X из потока cin

Б.7.3. Операции ввода

Почти все операции ввода описаны в заголовке

<istream>
, за исключением операций ввода в объект класса
string
; эти операции описаны в заголовке
<string>
:

<
Поделиться:
Популярные книги

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь