Spec-Zone.ru › C++

std::strstreambuf::seekoff

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 определяется следующим образом:
a) если way == ios_base::beg, то newoff равно нулю
b) если 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); // in/out
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    
    // absolute positioning both pointers
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // move both forward
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    
    // try to move both pointers 1 forward from current position
    if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur))
        std::cout << "moving both pointers from current position failed\n";
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    
    // move the write pointer 1 forward, but not the read pointer
    // can also be called as ss.seekp(1, std::ios_base::cur);
    ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out);
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    
    ss << 'a'; // write at put position
    std::cout << "Wrote 'a' at put position, the buffer is now: '";
    std::cout.write(a, sizeof a);
    std::cout << "'\n";
    
    char ch;
    ss >> ch;
    std::cout << "reading at get position gives '" << ch << "'\n";
}

Вывод:

put pos = 0 get pos = 0
put pos = 1 get pos = 1
moving both pointers from current position failed
put pos = 1 get pos = 1
put pos = 2 get pos = 1
Wrote 'a' at put position, the buffer is now: '12a'
reading at get position gives '2'

Отчеты об исправлениях

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

DR Применяется к Опубликованное поведение Корректное поведение
LWG 55 C++98 seekoff в случае ошибки возвращал неопределенную
некорректную позицию в потоке
pos_type(off_type(-1))
возвращается в случае ошибки

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/strstreambuf/seekoff

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API