FreeBSD Manual Pages
std::basic_...buf::seekoff(3) C++ Standard Libarystd::basic_...buf::seekoff(3) NAME std::basic_stringbuf::seekoff - std::basic_stringbuf::seekoff Synopsis protected: virtual pos_type seekoff( off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ); Repositions std::basic_streambuf::gptr and/or std::basic_stream- buf::pptr, if possible, to the position that corresponds to exactly off characters from beginning, end, or current position of the get and/or put area of the buffer. * If which includes std::ios_base::in and this buffer is open for reading (that is, if (which & std::ios_base::in) == std::ios_base::in), then repositions the read pointer std::basic_streambuf::gptr inside the get area as described below * If which includes std::ios_base::out and this buffer is open for writing (that is, (which & std::ios_base::out) == std::ios_base::out), then repositions the write pointer std::basic_streambuf::pptr inside the put area as described below * If which includes both std::ios_base::in and std::ios_base::out and the buffer is open for both reading and writing (that is, (which & (std::ios_base::in | std::ios_base::out)) == (std::ios_base::in | std::ios_base::out)), and dir is either std::ios_base::beg or std::ios_base::end, then reposi- tions both read and write pointers as described below. * Otherwise, this function fails. If gptr and/or pptr is repositioned, it is done as follows: 1) The new pointer offset newoff of type off_type is determined a) if dir == std::ios_base::beg, then newoff is zero b) if dir == std::ios_base::cur, then newoff is the current position of the pointer (gptr() - eback() or pptr() - pbase()) c) if dir == std::ios_base::end, then newoff is the length of the entire initialized part of the buffer (if over-allocation is used, the high watermark pointer minus the beginning pointer) 2) If the pointer to be repositioned is a null pointer and newoff would be non-zero, this function fails. 3) If newoff + off < 0 (the repositioning would move the pointer to before the beginning of the buffer) or if newoff + off would point past the end of the buffer (or past the last initialized character in the buffer if over-allo- cation is used), the function fails. 4) Otherwise, the pointer is assigned as if by gptr() = eback() + newoff + off or pptr() = pbase() + newoff + off. Parameters off - relative position to set the next pointer(s) to defines base position to apply the relative offset to. It can be one of the following constants: dir - Constant Explanation beg the beginning of a stream end the ending of a stream cur the current position of stream position indicator defines whether the input sequences, the output sequence, or both are affected. It can be one or a combination of the following constants: which - Constant Explanation in affect the input sequence out affect the output sequence Return value pos_type(newoff) on success, pos_type(off_type(-1)) on failure or if pos_type cannot represent the resulting stream position. Example // Run this code #include <iostream> #include <sstream> int main() { std::stringstream ss("123"); // 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 1 for- ward 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 " << ss.str() << '\n'; char ch; ss >> ch; std::cout << "reading at get position gives '" << ch << "'\n"; } Output: 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' Defect reports The following behavior-changing defect reports were applied retroac- tively to previously published C++ standards. DR Applied to Behavior as published Cor- rect behavior LWG 55 C++98 seekoff returned an undefined pos_type(off_type(-1)) invalid stream position on failure is returned on failure static constant members of LWG 375 C++98 std::ios_base were corrected misspecified as members of std::basic_ios seekoff might succeed even if newoff LWG 432 C++98 + off seekoff fails would point past the last initialized in this case character repositioning null gptr() and/or null LWG 453 C++98 pptr() it can suc- ceed in this case with a new offset of zero always failed the end pointer could not be used to LWG 563 C++98 calculate newoff because it could use the high watermark not be precisely controlled by the pointer in- stead program after resolving LWG issue 432 See also pubseekoff invokes seekoff() (public member function of std::basic_stream- buf<CharT,Traits>) seekpos repositions the next pointer in the input sequence, out- put sequence, or [virtual] both using absolute addressing (virtual protected member function) seekoff repositions the file position, using relative addressing [virtual] (virtual protected member function of std::basic_file- buf<CharT,Traits>) seekoff repositions the next pointer in the input sequence, out- put sequence, or [virtual] both, using relative addressing (virtual protected member function of std::strstreambuf) http://cppreference.com 2024.06.10 std::basic_...buf::seekoff(3)
NAME | Synopsis | Parameters | Return value | Example | Output: | See also
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::stringbuf::seekoff&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>
