Программирование >>  Операторы преобразования типа 

1 ... 204 205 206 [ 207 ] 208 209 210 ... 239


Таблица 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() используются для управления текущей позицией чтения и/или записи. Позиция зависит от последнего аргумента, который относится к типу ios base::openmode и по умолчанию равен los base::in ios base::out. При установленном флаге los base::ln изменяется позиция чтения, а при установленном флаге ios base::in - позиция записи. Функция pubseekposO перемещает поток данных в абсолютную позицию, заданную первым аргументом, тогда как функция pubseekoff() использует смещение, заданное по отношению к другой позиции. Смещение передается в первом аргументе. Позиция, по отношению к которой задается смещение, передается во втором аргументе и может быть равна ios 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)

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

другой механизм неформатированного ввода-вывода основан на использовании классов итераторов потоковых буферов. Эти классы удовлетворяют требованиям к итераторам ввода и вывода, предназначенным для чтения или записи отдельных символов в потоковых буферах, совместимы со средствами посимвольного ввода-вывода алгоритмов стандартной библиотеки С++.



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

namespace std {

template <class cliarT.

class traits = char traits<charT> > 1streambufj terator: template <class charT,

class traits = char traits<charT> > ostreambufjterator:

Эти итераторы представляют собой специализированные версии потоковых итераторов, описанных на с. 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 iterator<char>(ostream) Создание итератора потоковой:) буфера вывода

для потока 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. Операции итераторов потоковых буферов ввода

Выражение

Описание

istreambufJteralDr<char>()

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

istreambufJteralDr < clia г > (istream)

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

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

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

istreambufJterator<cliar>(bufferj)tr)

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

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

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

*iter

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

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

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

++iter

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

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

lter++

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

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

il£rl.equal(lter2)

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

iterl==iter2

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

iterl!=iter2

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

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



1 ... 204 205 206 [ 207 ] 208 209 210 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика