| I/O manipulators | ||||
| Print functions(C++23) | ||||
| C-style I/O | ||||
| Buffers | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++20) | ||||
| Streams | ||||
| Abstractions | ||||
| File I/O | ||||
| String I/O | ||||
| Array I/O | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
| Synchronized Output | ||||
(C++20) | ||||
| Types | ||||
| Error category interface | ||||
(C++11) | ||||
(C++11) |
| Public member functions | ||||
(C++11) | ||||
(C++11) | ||||
(C++26) | ||||
| Protected member functions | ||||
basic_filebuf::seekpos | ||||
| Non-member functions | ||||
(C++11) |
protected: virtual pos_type seekpos( pos_type sp, | ||
Repositions the file pointer, if possible, to the position indicated bysp. If the associated file is not open (is_open()==false), fails immediately.
Reposition performs as follows:
Ifsp was not obtained by callingseekoff() orseekpos() on the same file, the behavior is undefined.
Contents |
| sp | - | file position obtained byseekoff() orseekpos() 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 orpos_type(off_type(-1)) on failure.
seekpos() is called bystd::basic_streambuf::pubseekpos(), which is called by the single-argument versions ofstd::basic_istream::seekg() andstd::basic_ostream::seekp().
Many implementations do not update the get area inseekpos(), delegating tounderflow() that is called by the nextsgetc().
On some implementations, the get area is emptied byseekpos() and the secondunderflow() 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:
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.
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 |
| invokesseekpos() (public member function of std::basic_streambuf<CharT,Traits>)[edit] | |
[virtual] | repositions the file position, using relative addressing (virtual protected member function)[edit] |
| moves the file position indicator to a specific location in a file (function)[edit] |