На этом шаге мы рассмотрим итераторы потоковых буферов ввода.
В таблице 1 перечислены все операции итераторов потоковых буферов ввода. Этот интерфейс имеет много общего с потоковыми итераторами ввода (смотри 231 шаг). Кроме того, итератор можно инициализировать буфером, а также проверить равенство двух итераторов потоковых буферов ввода функцией equal(). Два итератора потоковых буферов ввода равны, если они оба установлены в конец потока данных или ни один из них не установлен в конец потока данных.
Выражение | Описание |
---|---|
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). У такого поведения имеются два важных следствия.
На следующем шаге мы рассмотрим пример использования итераторов потоковых буферов.