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.
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 | - | определяет базу для применения относительного смещения. Может принимать одно из следующих значений:
|
||||||||
| which | - | определяет, какие последовательности (вход, выход или оба) затрагиваются. Может принимать одно или несколько следующих значений:
|
Возвращаемое значение
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 | использовать указатель высокого уровня вместо |
См. также
вызывает seekoff() (публичный член-функция std::basic_streambuf<CharT,Traits>) |
|
|
[виртуальный] | перемещает следующий указатель в входной последовательности, выходной последовательности или обеих, используя абсолютное адресование (виртуальная защищенная функция-член) |
|
[виртуальный] | перемещает позицию файла, используя относительное адресование (виртуальная защищенная функция-член std::basic_filebuf<CharT,Traits>) |
|
[виртуальный] | перемещает следующий указатель в входной последовательности, выходной последовательности или обеих, используя относительное адресование (виртуальная защищенная функция-член 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