protected: virtual pos_type seekpos( pos_type sp, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); |
Repositions the file pointer, if possible, to the position indicated by sp
. If the associated file is not open (is_open() == false
), fails immediately.
Reposition performs as follows:
overflow()
.std::fsetpos()
.If sp
was not obtained by calling seekoff()
or seekpos()
on the same file, the behavior is undefined.
sp | - | file position obtained by seekoff() or seekpos() called earlier on the same file |
||||||
which | - | defines which of the input and/or output sequences to affect. It can be one or a combination of the following constants:
|
sp
on success or pos_type(off_type(-1))
on failure.
seekpos()
is called by std::basic_streambuf::pubseekpos()
, which is called by the single-argument versions of std::basic_istream::seekg()
and std::basic_ostream::seekp()
.
Many implementations do not update the get area in seekpos()
, delegating to underflow()
that is called by the next sgetc()
.
On some implementations, the get area is emptied by seekpos()
and the second underflow()
is necessary to observe the effects.
#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); }
Possible output:
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 55 | C++98 | seekpos returned an undefinedinvalid stream position on failure | pos_type(off_type(-1)) is returned on failure |
LWG 171 | C++98 | the sequence of the operations of reposition was not clear | made clear |
invokes seekpos() (public member function of std::basic_streambuf<CharT,Traits> ) |
|
[virtual] | repositions the file position, using relative addressing (virtual protected member function) |
moves the file position indicator to a specific location in a file (function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_filebuf/seekpos