Анимация
JavaScript
|
Главная Библионтека Классы потоковых буферов Как упоминалось на с. 564, потоки данных не выполняют непосредственные операции чтения и записи, а поручают их потоковым буферам. Этот раздел посвящен работе классов буферов. Приведенный материал не только поможет глубже разобраться в том, как работают потоки данных при вводе-выводе, но и заложит основу для определения новых каналов ввода-вывода. Прежде чем переходить к подробному описанию потоковых буферов, рассмотрим их открытый интерфейс. Потоковые буферы с точки зрения пользователя с точки зрения пользователя потокового буфера, класс basic streambuf представляет собой нечто, принимающее н отправляющее символы. В табл. 13.41 приведены версии открытых функций для вывода символов. Таблица 13.41. Открытые функции вывода символов Функция Описание sputc(c) Выводит символ с в потоковый буфер sputc(5, п) Выводит п символов из последовательности s в потоковый буфер Функция sputc() возвращает traits type::eof() в случае ошибки, где trait5 type - определение типа в классе basic streambuf. Функция sputn() выводит количество символов, заданное вторым аргументом, если только выводу не помешают недостаточные размеры строкового буфеа. Символы завершения строк при выводе не учитываются. Фзп1кция возвращает количество выведенных символов. О При вводе-выводе должна учитываться текущая форматная спецификация потока данных. Прежде всего это относится к ширине поля при выводе. О При возникновении ошибок должен быть установлен соответствующий флаг состояния. О Ошибки не должны изменять состояние объекта. Если оператор читает несколько объектов данных, промежуточные результаты сохраняются во временных объектах до окончательного принятия значения. О Вывод не должен завершаться символом новой строки, в основном из-за того, что это не позволит вывести другие объекты в той же строке. О Даже слишком большие данные должны читаться полностью. После чтения следует установить соответствующий флаг ошибки, а возвращаемое значение должно содержать полезную информацию (например, максимальное допустимое значение). О При обнаружении ошибки форматирования следует по возможности прекратить чтение. Интерфейс чтения символов из потокового буфера устроен несколько сложнее (табл. 13.42). Дело в том, что при вводе иногда требуется узнать символ без его извлечения из буфера. Кроме того, желательно предусмотреть возможность возврата символов в потоковый буфер. Соответствующие функции поддерживаются классами потоковых буферюв. Таблица 13.42. Открытые функции ввода символов Функция Описание in avail() Возвращает нижнюю границу доступных символов sgetcO Возвращает текущий символ без его извлечения из буфера sbumpcO Возвращает текущий символ с извлечением из буфера snextcO Извлекает текущий символ из буфера и воэвраиает следующий символ sgetn(b,n) Читвет п симвопов и сохраняет их в буфере b sputbackc(c) Возвращает символ с в потоковый буфер sungetcO Возвращается на одну позицию к предыдущему символу Функция in avail() проверяет минимальное количество доступных символов. Например, с ее помощью можно убедиться в том, что чтение не будет заблокировано при вводе с клавиатуры. С другой стороны, количество доступных символов может быть больще значения, возвращаемого этой функцией. Пока потоковый буфер не достигнет конца потока данных, один из символов считается «текущим». Функция sgetc() используется для получения текущего символа без перемещения к следующему символу. Функция sbumpc() читает текущий символ и переходит к следующему символу, который становится текущим. Последняя из функций чтения отдельных символов, snextc(), переходит к следующему символу и читает новый текущий символ. Для обозначения неудачи все три функции возвращают traits type::eof(). Функция sgetn() читает в буфер последовательность символов, максимальная длина которой передается в аргументе. Функция возвращает количество прочитанных символов. Функции sputbackcO и sungetc() возвращаются на одну позицию в потоке данных, вследствие чего текущим становится предыдущий символ. Функция SputbackcO может использоваться для замены предыдущего символа другим символом. При вызове этих функций необходимо соблюдать осторожность: нередко возврат ограничивается всего одним символом. Отдельная группа функций используется для подключения объекта локального контекста, для смены позиции и управления буферизацией. Эти функции перечислены в табл. 13.43. Функции pubimbueO и getlocO используются при интернационализации (см. с. 601). Функция pubimbueO подключает новый объект локального контекста к потоковому буферу и возвращает ранее установленный объект локального контекста. Функция getlocO возвращает текущий объект локального контекста. Таблица 13.43. Прочие функции открытого интерфейса потоковых буферов Функция Опнсанне pubinfibue(loc) Ассоциирует потоковый буфер с локальным контекстом 1ос getlocO Возвращает текущий локальный контекст pub5eekpos(po5) Перемещает текущую позицию в заданную абсолютную позицию pubseekposCpos, which) То же с указанием направления ввода-вывода pubseekofFCoffset, rpos) Перемещает текущую позицию по отношению к другой позиции pubseekorF(offset, rpos, which) То же с указанием направления ввода-вывода pubsetbuf(b,n) Управление буферизацией Функция pubsetbufO позволяет в определенной степени управлять стратегией буферизации потоковых буферов. Тем не менее ее возможности зависят от конкретного класса потокового буфера. Например, вызов функции pubsetbuf() для буферов строковых потоков данных не имеет смысла. Даже для буферов файловых потоков данных применение этой функции переносимо лишь в том случае, если она вызывается перед выполнением первой операции ввода-вывода в формате pubsetbuf(0,0) (то есть буфер не используется). Функция возвращает объект потокового буфера при успешном завершении или О в случае неудачи. Функции pubseekoffO и pubseekpos() используются для управления текущей позицией чтения и/или записи. Позиция зависит от последнего аргумента, который относится к типу los„base::openmode и по умолчанию равен los base::in ios base::out. При установленном флаге los base::ln изменяется позиция чтения, а при установленном флаге ios base::in - позиция записи. Функция pubseekposO перемещает поток данных в абсолютную позицию, заданную первым аргументом, тогда как функция pubseekoff() использует смещение, заданное по отношению к другой позиции. Смещение передается в первом аргументе. Позиция, по отношению к которой задается смещение, передается во втором аргументе и может быть равна los base::cur, ios base::beg или ios„base;:end (за подробностями обращайтесь на с. 610). Обе функции возврашают новую текущую позицию или признак недействительной позиции. Чтобы обнаружить недействительную позицию, следует сравнить результат с объектом pos type(off type(-l)) - типы pos type и off type используются для определения позиций в потоках данных (см. с. 609). Текущая позиция потока возвращается функцией pubseekoff(): sbuf.pubseekoff(0. std:;1os::cur) Итераторы потоковых буферов Другой механизм неформатированного ввода-вывода основан на использовании классов итераторов потоковых буферов. Эти классы удовлетворяют требованиям к итераторам ввода и вывода, предназначенным для чтения или записи отдельных символов в потоковых буферах,« совместимы со средствами посимвольного ввода-вывода алгоритмов стандартной библиотеки С++. 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 |