# std::basic_filebuf::seekpos

From cppreference.com
< cpp‎ | io‎ | basic filebuf

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

which

-

defines which of the input and/or output sequences to affect. It can be one or a combination of the following constants:

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 nest 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`)
seekoff [virtual] | repositions the file position, using relative addressing (virtual protected member function)
fseek | moves the file position indicator to a specific location in a file (function)

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/io/basic_filebuf/seekpos&oldid=81570"