Namespaces
Variants

std::basic_stringbuf<CharT,Traits,Allocator>:: seekoff

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
std:: ios_base :: seekdir dir,

std:: ios_base :: openmode which = std:: ios_base :: in | std:: ios_base :: out ) ;

Перемещает std::basic_streambuf::gptr и/или std::basic_streambuf::pptr , если возможно, в позицию, соответствующую ровно off символам от начала, конца или текущей позиции области чтения и/или записи буфера.

Если gptr и/или pptr перепозиционируются, это выполняется следующим образом:

1) Новое смещение указателя newoff типа off_type определяется
а) если dir == std:: ios_base :: beg , тогда newoff равен нулю
б) если dir == std:: ios_base :: cur , тогда newoff является текущей позицией указателя ( gptr ( ) - eback ( ) или pptr ( ) - pbase ( ) )
c) если dir == std:: ios_base :: end , тогда newoff - это длина всей инициализированной части буфера (если используется over-allocation , указатель верхней границы минус указатель начала)
2) Если указатель, который требуется переместить, является нулевым указателем и newoff должен быть ненулевым, данная функция завершается неудачей.
3) Если newoff + off < 0 (перемещение указателя приведёт к его позиционированию до начала буфера) или если newoff + off будет указывать за пределы конца буфера (или за последний инициализированный символ в буфере при использовании over-allocation ), функция завершается неудачей.
4) В противном случае указатель назначается как если бы с помощью gptr ( ) = eback ( ) + newoff + off или pptr ( ) = pbase ( ) + newoff + off .

Содержание

Параметры

off - относительная позиция для установки следующего указателя(ей)
dir - определяет базовую позицию для применения относительного смещения. Может быть одной из следующих констант:
Константа Объяснение
beg начало потока
end конец потока
cur текущая позиция индикатора позиции потока
which - определяет, влияет ли на входную последовательность, выходную последовательность или на обе. Может быть одной или комбинацией следующих констант:
Константа Объяснение
in влияет на входную последовательность
out влияет на выходную последовательность

Возвращаемое значение

pos_type ( newoff ) при успехе, pos_type ( off_type ( - 1 ) ) при неудаче или если pos_type не может представить результирующую позицию в потоке.

Пример

#include <iostream>
#include <sstream>
int main()
{
    std::stringstream ss("123"); // ввод/вывод
    std::cout << "позиция записи = " << ss.tellp()
              << " позиция чтения = " << ss.tellg() << '\n';
    // абсолютное позиционирование обоих указателей
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // переместить оба на 1 вперед
    std::cout << "позиция записи = " << ss.tellp()
              << " позиция чтения = " << ss.tellg() << '\n';
    // попытка переместить оба указателя на 1 вперед от текущей позиции
    if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur))
        std::cout << "перемещение обоих указателей из текущей позиции не удалось\n";
    std::cout << "позиция записи = " << ss.tellp()
              << " позиция чтения = " << ss.tellg() << '\n';
    // переместить указатель записи на 1 вперед, но не указатель чтения
    // также может быть вызвано как ss.seekp(1, std::ios_base::cur);
    ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out);
    std::cout << "позиция записи = " << ss.tellp()
              << " позиция чтения = " << ss.tellg() << '\n';
    ss << 'a'; // запись в позиции записи
    std::cout << "Записано 'a' в позиции записи, буфер теперь " << ss.str() << '\n';
    char ch;
    ss >> ch;
    std::cout << "чтение в позиции чтения дает '" << ch << "'\n";
}

Вывод:

позиция записи = 0 позиция чтения = 0
позиция записи = 1 позиция чтения = 1
перемещение обоих указателей из текущей позиции не удалось
позиция записи = 1 позиция чтения = 1
позиция записи = 2 позиция чтения = 1
Записано 'a' в позиции записи, буфер теперь 12a
чтение в позиции чтения дает '2'

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 55 C++98 seekoff возвращал неопределённую
недопустимую позицию в потоке при ошибке
pos_type ( off_type ( - 1 ) )
возвращается при ошибке
LWG 375 C++98 статические константные члены std::ios_base были
ошибочно указаны как члены std::basic_ios
исправлено
LWG 432 C++98 seekoff мог завершиться успешно, даже если newoff + off
указывал бы за последний инициализированный символ
seekoff завершается ошибкой
в этом случае
LWG 453 C++98 репозиционирование нулевого gptr ( ) и/или нулевого pptr ( )
с новым смещением ноль всегда завершалось ошибкой
может завершиться успешно в этом случае
LWG 563 C++98 конечный указатель не мог быть использован для вычисления newoff потому что он не мог
быть точно контролируем программой после разрешения LWG issue 432
использовать указатель верхней границы
вместо этого

Смотрите также

вызывает seekoff ( )
(публичная функция-член std::basic_streambuf<CharT,Traits> )
[virtual]
перепозиционирует следующий указатель во входной последовательности, выходной последовательности или в обеих, используя абсолютную адресацию
(виртуальная защищенная функция-член)
[virtual]
перепозиционирует позицию в файле, используя относительную адресацию
(виртуальная защищенная функция-член std::basic_filebuf<CharT,Traits> )
[virtual]
перепозиционирует следующий указатель во входной последовательности, выходной последовательности или в обеих, используя относительную адресацию
(виртуальная защищенная функция-член std::strstreambuf )