Классы потоковых буферов. Итераторы потоковых буферов ввода

   
На этом шаге мы рассмотрим итераторы потоковых буферов ввода.

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

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

ВыражениеОписание
istreambuf_iterator<char>()Создает итератор конца потока
istreambuf_iterator<char>(istream)Создает итератор потокового буфера ввода для потока istream, возможно, с чтением первого символа функцией sgetc()
istreambuf_iterator<char>(buffer_ptr)Создает итератор потокового буфера ввода для буфера, на который ссылается указатель buffer_ptr, возможно, с чтением первого символа функцией sgetc()
*iterВозвращает текущий символ, ранее прочитанный функцией sgetc() (читает первый символ, если он не был прочитан конструктором)
++iterЧитает следующий символ функцией sbumpc() и возвращает его позицию
iter++Читает следующий символ функцией sbumpc(), но возвращает итератор для предыдущего символа
iter1.equal(iter2)Проверяет равенство двух итераторов
iter1==iter2Проверка на равенство iter1 и iter2
iter1!=iter2Проверка на неравенство iter1 и iter2

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

  • Интервал от текущей позиции до конца потока данных определяется двумя итераторами istreambuf_iterator<charT,traits>(поток) (текущая
    позиция) и istreambuf_iterator<charT,traits>() (конец потока), где поток относится к типу basic_istream<charT,traits> или
    basic_streambuf<charT,traits>.
  • Класс istreambuf_iterator не позволяет создавать подинтервалы.

   
На следующем шаге мы рассмотрим пример использования итераторов потоковых буферов.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий