|
Программирование >> Операторы преобразования типа
Таблица 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.45 перечислены все операции итераторов потоковых буферов ввода. Этот интерфейс имеет много общего с потоковыми итераторами ввода (см. с. 284). Кроме того, итератор можно инициализировать буфером, а также проверить равенство двух итераторов потоковых буферов ввода функцией equal(). Два итератора потоковых буферов ввода равны, если они оба установлены в конец потока данных или ни один из них не установлен в конец потока данных. Таблица 13.45. Операции итераторов потоковых буферов ввода Выражение Описание
Из этого следует несколько неочевидная формулировка эквивалентности объектов типа istreambufjterator. Два объекта типа istreambufjterator считаются эквивалентными, если оба итератора установлены в конец потока данных или ни один из них не установлен в конец потока данных (совпадают ли при этом буферы - значения не имеет). В частности, итератор, установленный в конец потока данных, может бьггь получен при конструировании итератора конструк-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |