каналом и средствами вставки и извлечения при организации межпроцессного взаимодействия.
Для чтения данных из канала и записи данных в канал можно также испо л ьзовать семейство к л ассов fstream и функции-ч л ены read () и write ().
Доступ к анонимным каналам c использованием итератора ostream_iterator
Канал можно также испо л ьзовать с итераторами ostream_iterator и istream_ iterator, которые представляют собой обобщенные объектно-ориентированные указатели. Итератор ostream_iterator позволяет передавать через канал целые контейнеры (т.е. списки, векторы, множества, очереди и пр.). Без использования iostreamo6beKTOB и итератора ostream_iterator передача контейнеров объектов была бы очень громоздкой и подверженной ошибкам процедурой. Операции, которые доступны для классов ostream_iterator и istream_iterator, перечислены в табл. 11.4.
Рис.11.9. Взаимоотношения между объектами классов ifstream, ofstream, каналом и средствами вставки и извлечения при организации межпроцессного взаимодействия |
Таблица»11.4. Операции, доступныедля классов ostream_iterator и istream_iterator
istream_iterator
а == b отношение эквивалентности
а != b отношение неэквивалентности
*a разыменовывание
++r инкремент (префиксная форма)
r++ инкремент (постфиксная форма)
ostream_iterator
++r инкремент (префиксная форма)
r++ инкремент (постфиксная форма)
Обычно эти итераторы используются вместе с iostreams-классами и стандартными алгоритмами. Итератор ostream_iterator предназначен только для последовательно выполняемой записи. После доступа к некоторому элементу программист не может вернуться к нему опять, не повторив всю итерацию сначала. При использовании этих итераторов канал обрабатывается как последовательный контейнер. Это означает, что при связывании канала с iostreams-объектами посредством итератора ostream_iterator и файловых дескрипторов мы можем применить стандартный алгоритм обработки данных для ввода их из канала и вывода их в канал. Причина того, что эти итераторы можно использовать вместе с каналами, состоит в связи, которая существует между итераторами и iostreams-классами. На рис. 11.10 представлена диаграмма, отображающая отношения между итераторами ввода-вывода и iostreams-классами.
Рис. 11.10. Отношения между итераторами ввода-вывода и iostreams-классами |
На рис. 11.10 также показано, как эти классы взаимодействуют с объектно-ориентированным каналом. Рассмотрим подробнее, как итератор ostream_iterator используется с объектом класса ostream. Если инкрементируется указатель, мы ожидаем, что он будет указывать на следующую область памяти. Если же инкрементируется итератор