Namespaces
Variants

std::strstreambuf:: seekoff

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
ios_base :: seekdir way,

ios_base :: openmode which = ios_base :: in | ios_base :: out ) ;
(устарело в C++98)
(удалено в C++26)

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

  • Если which включает ios_base :: in и этот буфер открыт для чтения, то перемещает указатель чтения std::basic_streambuf::gptr внутри области получения, как описано ниже.
  • Если which включает ios_base :: out и этот буфер открыт для записи, то перемещает указатель записи std::basic_streambuf::pptr внутри области размещения, как описано ниже.
  • Если which включает как ios_base :: in так и ios_base::out , буфер открыт и для чтения, и для записи, а way равен либо ios_base :: beg либо ios_base :: end , то перемещает оба указателя (чтения и записи), как описано ниже.
  • В противном случае функция завершается неудачно.

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

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

Содержание

Параметры

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

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

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

Пример

#include <iostream>
#include <strstream>
int main()
{
    char a[] = "123";
    std::strstream ss(a, sizeof a); // ввод/вывод
    std::cout << "позиция записи = " << ss.tellp()
              << " позиция чтения = " << ss.tellg() << '\n';
    // абсолютное позиционирование обоих указателей
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // переместить оба вперед
    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' в позиции записи, буфер теперь: '";
    std::cout.write(a, sizeof a);
    std::cout << "'\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 ) )
возвращается при ошибке

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

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