table of contents
        
      
      
    | std::basic_filebuf::seekpos(3) | C++ Standard Libary | std::basic_filebuf::seekpos(3) | 
NAME¶
std::basic_filebuf::seekpos - std::basic_filebuf::seekpos
Synopsis¶
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.
  
   If the file is open for writing, first writes the put area and any unshift
    sequences
  
   required by the currently imbued locale, using overflow()
  
   Then repositions the file pointer, as if by calling std::fsetpos()
  
   If the file is open for reading, updates the get area if necessary.
  
   If sp was not obtained by calling seekoff() or seekpos() on the same file,
    the
  
   behavior is undefined.
Parameters¶
 sp - file position obtained by seekoff() or seekpos() called
    earlier on the same
  
   file
  
   defines which of the input and/or output sequences to affect. 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¶
sp on success or pos_type(off_type(-1)) on failure.
Notes¶
 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()
Example¶
 on some implementations, the get area is emptied by seekpos() and
    the second
  
   underflow() is necessary to observe the effects
// Run this code
  
   #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
See also¶
 pubseekpos invokes seekpos()
  
   (public member function of std::basic_streambuf<CharT,Traits>)
  
   seekoff repositions the file position, using relative addressing
  
   [virtual] (virtual protected member function)
  
   fseek moves the file position indicator to a specific location in a file
  
   (function)
| 2022.07.31 | http://cppreference.com |