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

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

Жанры

Программирование. Принципы и практика использования 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>
:

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит