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++.

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()
с новым смещением 0 всегда завершалось ошибкой
оно может завершиться успешно в этом случае
LWG 563 C++98 указатель конца не мог быть использован для расчёта newoff из-за
того, что он не мог быть точно контролируемым программой после решения LWG issue 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/w/cpp/io/basic_stringbuf/seekoff

Spec-Zone.ru

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