std::strstreambuf:: seekpos
|
protected
:
virtual
pos_type seekpos
(
pos_type sp,
|
(устарело в C++98)
(удалено в C++26) |
|
Перемещает std::basic_streambuf::gptr и/или std::basic_streambuf::pptr , если возможно, в позицию, указанную sp .
Если
std::ios_base::in
установлен в
which
, предпринимается попытка перепозиционировать
gptr()
(следующий указатель в области чтения). Если
std::ios_base::out
установлен в
which
, предпринимается попытка перепозиционировать
pptr()
(следующий указатель в области записи). Если ни один бит не установлен в
which
, операция завершается неудачей.
Каждый следующий указатель перемещается следующим образом:
- Если следующий указатель равен null, операция завершается неудачей.
-
В противном случае новое смещение
newoff
(типа
off_type) определяется вызовом sp. offset ( ) . Если newoff отрицательное, выходит за границы буфера или недопустимо, операция завершается неудачей. - В противном случае следующий указатель присваивается как если бы gptr ( ) = eback ( ) + newoff или pptr ( ) = pbase ( ) + newoff .
Содержание |
Параметры
| sp | - |
позиция в потоке, например, полученная с помощью
seekoff()
или
seekpos()
|
||||||
| which | - |
определяет, какая последовательность затрагивается: входная, выходная или обе. Может быть одной или комбинацией следующих констант:
|
Возвращаемое значение
Результирующее смещение, преобразованное в
pos_type
при успехе или
pos_type
(
off_type
(
-
1
)
)
при неудаче.
Примечания
seekpos()
вызывается функцией
std::basic_streambuf::pubseekpos()
, которая в свою очередь вызывается однопараметрическими версиями
std::basic_istream::seekg()
и
std::basic_ostream::seekp()
.
Пример
#include <cstring> #include <iostream> #include <strstream> struct mybuf : std::strstreambuf { mybuf(const char* str) : std::strstreambuf(str, std::strlen(str)) {} pos_type seekpos(pos_type sp, std::ios_base::openmode which) { std::cout << "Before seekpos(" << sp << "), size of the get area is " << egptr() - eback() << " with " << egptr() - gptr() << " read positions available.\n"; pos_type rc = std::strstreambuf::seekpos(sp, which); std::cout << "seekpos() returns " << rc << ".\nAfter the call, " << "size of the get area is " << egptr() - eback() << " with " << egptr() - gptr() << " read positions available.\n"; return rc; } }; int main() { mybuf buf("12345"); std::iostream stream(&buf); stream.seekg(2); }
Вывод:
Before seekpos(2), size of the get area is 5 with 5 read positions available. seekpos() returns 2. After the call, size of the get area is 5 with 3 read positions available.
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 55 | C++98 |
seekpos
возвращал неопределённую
недопустимую позицию потока при ошибке |
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>
)
|