This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++14 status.

### 2341. Inconsistency between `basic_ostream::seekp(pos)` and `basic_ostream::seekp(off, dir)`

Section: 29.7.5.2.5 [ostream.seeks] Status: C++14 Submitter: Marshall Clow Opened: 2013-10-21 Last modified: 2017-07-05

Priority: 0

View all issues with C++14 status.

Discussion:

In 29.7.5.2.5 [ostream.seeks], we have:

>     basic_ostream<charT,traits>& seekp(pos_type pos);

> > -3- Effects: If `fail() != true`, executes `rdbuf()->pubseekpos(pos, ios_base::out)`. In case of failure, the function calls `setstate(failbit)` (which may throw `ios_base::failure`).

> > -4- Returns: `*this`.

>     basic_ostream<charT,traits>& seekp(off_type off, ios_base::seekdir dir);

> > -5- Effects: If `fail() != true`, executes `rdbuf()->pubseekoff(off, dir, ios_base::out)`.

> > -6- Returns: `*this`.

The first call is required to set the `failbit` on failure, but the second is not

So (given two ostreams, `os1` and `os2`) the following code (confusingly) works:

>     os1.seekp(-1);
>     assert(os1.fail());

>     os2.seekp(-1, std::ios_base::beg);
>     assert(os2.good());

Note that the description of `basic_istream<charT,traits>& seekg(off_type off, ios_base::seekdir dir)` in 29.7.4.4 [istream.unformatted] p43 does require setting `failbit`.

[Issaquah 2014-02-11: Move to Immediate]

Proposed resolution:

This wording is relative to N3797.

1. Modify 29.7.5.2.5 [ostream.seeks]p5 as indicated:

   >     basic_ostream<charT,traits>& seekp(off_type off, ios_base::seekdir dir);

   > > -5- Effects: If `fail() != true`, executes `rdbuf()->pubseekoff(off, dir, ios_base::out)`. In case of failure, the function calls `setstate(failbit)` (which may throw `ios_base::failure`).

   > > -6- Returns: `*this`.