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 ); |
Перемещает 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 | - | определяет базу для применения относительного смещения. Может быть одним из следующих констант:
|
||||||||
| which | - | определяет, какие последовательности (вход, вывод или оба) будут затронуты. Может быть одной или комбинацией следующих констант:
|
Возвращаемое значение
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))возвращается при ошибке |
См. также
|
[virtual] |
перемещает следующий указатель в входной последовательности, выходной последовательности или в обеих с использованием абсолютного адресования (виртуальная защищенная функция-член) |
|
[virtual] |
перемещает следующий указатель в входной последовательности, выходной последовательности или в обеих с использованием относительного адресования (виртуальная защищенная функция-член класса std::basic_streambuf<CharT,Traits>) |
|
[virtual] |
перемещает следующий указатель в входной последовательности, выходной последовательности или в обеих с использованием относительного адресования (виртуальная защищенная функция-член класса std::basic_stringbuf<CharT,Traits,Allocator>) |
|
[virtual] |
перемещает позицию файла с использованием относительного адресования (виртуальная защищенная функция-член класса std::basic_filebuf<CharT,Traits>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/strstreambuf/seekoff