Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 [ 207 ] 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

Шаблоны istreambufjterator и ostreambufJterator используются для чтения или записи отдельных символов с объектами типа baslc streambuf. Определения этих классов в заголовочном файле <iterator> выглядят примерно так:

namespace std {

template <class charT.

class traits = char traits<charT> > i streambufJ terator: template <class chart,

class traits = char traits<charT> > ostreambuf Jterator:

Эти итераторы представляют собой специализированные версии потоковых итераторов, описанных на с. 281, Единственное отличие заключается в том, что их элементы относятся к символьному типу.

Итераторы потоковых буферов вывода

Вывод строки в потоковый буфер с использованием итератора ostreambuf Jterator выполняется так:

Создание итератора для буфера или выходного потока cout std::ostreambufJterator<char> bufWr1ter(std::cout):

std::string helloChello. world\n"): std: :copy(hello.beginO. hello.endO. bufWriter);

В первой строке этого фрагмента конструируется итератор вывода типа ostreambuf Jterator для объекта cout. Вместо передачи выходного потока данных можно сразу передать указатель на потоковый буфер. Остальные команды конструируют объект string и копируют символы этого объекта через сконструированный итератор вывода.

В табл. 13.44 перечислены все операции итераторов потоковых буферов вывода. Этот интерфейс имеет много общего с потоковыми итераторами вывода (см. с. 282). Кроме того, итератор можно инициализировать буфером, а также проверить возможность записи через итератор функцией failed(). Если предыдущий вывод символов завершился неудачей, failed() возвращает true. В этом случае любые попытки записи оператором = ни к чему не приводят.

Таблица 13.44. Операции итераторов потоковых буферов вывода Выражение Описание

ostreanibuf lterator<char>(ostreann) Создание итератора потокового буфера вывода

для потока ostream

ostreambufJterator<char>(buffer ptr) Создание итератора потокового буфера вывода

для буфера, на который ссылается указатель buffer ptr

iter Фиктивная операция (возвращает iter)



Глава 13. Ввод-вывод с использованием потоковых классов

Таблица 13.44 (продолжение)

Выражение

Описание

iter = с

Записывает символ с в буфер вызовом функции sputc(c)

++iter

Фиктивная операция (возвращает iter)

iter++

Фиктивная операция (возвращает iter)

failedO

Проверка вазможности дальнейшей записи через

итератор потокового буфера вывода

Итераторы потоковых буферов ввода

в табл. 13.45 перечислены все операции итераторов потоковых буферов ввода. Этот интерфейс имеет много общего с потоковыми итераторами ввода (см. с. 284). Кроме того, итератор можно инициализировать буфером, а также проверить равенство двух итераторов потоковых буферов ввода функцией equal(). Два итератора потоковых буферов ввода равны, если они оба установлены в конец потока данных или ни один из них не установлен в конец потока данных.

Таблица 13.45. Операции итераторов потоковых буферов ввода

Выражение

Описание

istreambufJterator<char>()

Создает итератор конца потока

istreambuf Jterator < cha г > (istream)

Создает итератор потокового буфера ввода

для потока istream, возможно, с чтением первого

символа функцией sgetc()

istreambufJterator<char>(bufferj)tr)

Создает итератор потокового буфера ввода для буфера,

на который ссылается указатель buffer ptr, возможно.

с чтением первого символа функцией sgetc()

*iter

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

функцией sgetc() (читает первый символ, если

он не был прочитан конструктором)

++tter

Читает следующий символ функцией sbumpc()

и возвращает его позицию

iter++

Читает следующий символ функцией sbumpc().

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

iterl.equat(iter2)

Проверяет равенство двух итераторов

iterl==iter2

Проверка на равенство iterl и iter2

iterl!=iter2

Проверка на неравенс1во iterl и iter2

Из этого следует несколько неочевидная формулировка эквивалентности объектов типа istreambufjterator. Два объекта типа istreambufjterator считаются эквивалентными, если оба итератора установлены в конец потока данных или ни один из них не установлен в конец потока данных (совпадают ли при этом буферы - значения не имеет). В частности, итератор, установленный в конец потока данных, может быть получен при конструировании итератора конструк-



тором по згмолчанию. Кроме того, итератор istreambuf iterator устанавливается в конец потока данных при попытке вывести итератор за конец потока (то есть когда SbumpcO возвращает traits type; :eof)- У такого поведения имеются два важных следствия.

О Интервал от текущей позиции до конца потока данных определяется двумя итераторами istreambufJterator<charT,traits>(womoK) (текущая позиция) и istreambufJterator<charT,traits>() (конец потока)» где поток относится к тину basicJstream<charT,traits> или basic streambuf<charT,traits>.

О Класс Istreambufjterator не позволяет создавать подинтервалы.

Пример использования итераторов потоковых буферов

Далее представлен классический фильтр, который просто выводит все прочитанные символы при помощи итераторов потоковых буферов. Он представляет собой видоизмененную версию примера, показанного на с. 586:

io/charcat2.cpp finclude <iostream> finclude <iterator> using namespace std:

int mainO {

Итератор потокового буфера ввода для cin i streambufJ terator<char> 1npos(ci n):

Итератор конца потока

1streambuf iterator<char> endpos:

Итератор потокового буфера вывода для cout ostreambuf 1terator<char> outpos(cout):

Пока итератор ввода остается действительным while (inpos !- endpos) {

*outpos - *inpos: Присвоить его значение итератору вывода

++inpos:

++outpos;

1ользовательские потоковые буферы

Потоковые буферы предназначены для выполнения ввода-вывода, а их интерфейс определяется классом basic streambuf. Для типов символов char и wcharj определены специализации streambuf и wstreambuf. Эти классы используются в качестве базовых при реализации взаимодействий через специальные каналы ввода-вывода, однако для этого необходимо хорошо понимать принципы работы потоковых буферов.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 [ 207 ] 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239