Spec-Zone.ru › C++

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

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 символов от начала, конца или текущей позиции области чтения и/или записи буфера.

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

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

1) Определяется новое смещение указателя newoff типа off_type
a) если dir == std::ios_base::beg, то newoff равно нулю
b) если dir == std::ios_base::cur, то newoff — текущая позиция указателя (gptr() - eback() или pptr() - pbase())
c) если dir == std::ios_base::end, то newoff — длина всей инициализированной части буфера (если используется избыточное выделение памяти, указатель верхней границы минус указатель начала)
2) Если перемещаемый указатель — нулевой указатель и newoff было бы ненулевым, функция завершается неудачно.
3) Если newoff + off < 0 (перемещение указателя привело бы его до начала буфера) или если newoff + off указывало бы за конец буфера (или за последний инициализированный символ буфера, если используется избыточное выделение памяти), функция завершается неудачно.
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"); // 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 1 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 " << ss.str() << '\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++.

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
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 432 программа не могла точно управлять его положением вместо него использовать
указатель верхней границы

См. также

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

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

Spec-Zone.ru

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