std::basic_filebuf<CharT,Traits>:: seekpos
|
protected
:
virtual
pos_type seekpos
(
pos_type sp,
|
||
Перемещает указатель файла, если возможно, в позицию, указанную sp . Если связанный файл не открыт ( is_open ( ) == false ), завершается неудачей немедленно.
Reposition выполняется следующим образом:
Если
sp
не был получен вызовом
seekoff()
или
seekpos()
на том же файле, поведение не определено.
Содержание |
Параметры
| sp | - |
позиция в файле, полученная с помощью
seekoff()
или
seekpos()
вызванных ранее на том же файле
|
||||||
| which | - |
определяет, какую из входных и/или выходных последовательностей затронуть. Может быть одной или комбинацией следующих констант:
|
Возвращаемое значение
sp при успехе или pos_type ( off_type ( - 1 ) ) при неудаче.
Примечания
seekpos()
вызывается функцией
std::basic_streambuf::pubseekpos()
, которая, в свою очередь, вызывается однопараметрическими версиями
std::basic_istream::seekg()
и
std::basic_ostream::seekp()
.
Многие реализации не обновляют область get в
seekpos()
, делегируя это
underflow()
, который вызывается следующим
sgetc()
.
Пример
В некоторых реализациях область получения опустошается функцией
seekpos()
и второй вызов
underflow()
необходим для наблюдения эффектов.
#include <fstream> #include <iostream> struct mybuf : std::filebuf { 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::filebuf::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"; // uncomment if get area is emptied by seekpos() // std::filebuf::underflow(); // std::cout << "after forced underflow(), size of the get area is " // << egptr() - eback() << " with " // << egptr() - gptr() << " read positions available.\n"; return rc; } }; int main() { mybuf buf; buf.open("test.txt", std::ios_base::in); std::istream stream(&buf); stream.get(); // read one char to force underflow() stream.seekg(2); }
Возможный вывод:
Before seekpos(2), size of the get area is 110 with 109 read positions available. seekpos() returns 2. After the call, size of the get area is 110 with 108 read positions available.
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 55 | C++98 |
seekpos
возвращал неопределённую
недопустимую позицию потока при неудаче |
pos_type
(
off_type
(
-
1
)
)
возвращается при неудаче |
| LWG 171 | C++98 | последовательность операций репозиционирования была неясной | прояснена |
Смотрите также
|
вызывает
seekpos
(
)
(публичная функция-член
std::basic_streambuf<CharT,Traits>
)
|
|
|
[virtual]
|
перемещает позицию в файле, используя относительную адресацию
(виртуальная защищенная функция-член) |
|
перемещает индикатор позиции файла в определенное место в файле
(функция) |