What are the differences between streampos and pos_type, streamoff and off_type?

c++

Solution

`std::basic_istream` and `std::basic_ostream` both take two template types, `CharT` and `Traits`. Given a class A that is derived from one of the basic-streams, the `Traits` data type can be retrieved as

A::traits_type

According to §21.2 of the C++ standard, this data type must provide the following member types:

char_type // must be identical to CharT of the basic-stream
off_type
pos_type

(and some further data types irrelevant to the present question). Given the way the `std::basic_istream<>::seekg()` method is defined, the intended meaning of `off_type` and `pos_type` is:

- `pos_type` is used for absolute positions in the stream

- `off_type` is used for relative positions

So if you want to use the absolute version of `seekg()`, the data type you should declare is `A::pos_type` (which is the same as `A::traits_type::pos_type`). For the relative version it is `A::off_type`.

Regarding `std::streampos` and `std::streamoff`: These are defined, too, by the standard as the data types that are used for the default version of the `traits_type`. In other words, if you do not explicitly specify the `Traits` template parameter, the `A::pos_type` will in fact be `std::streampos`, and `A::off_type` will in fact be `std::streamoff`.

If you create your own version of `Traits` and want to use it with standard library templates like `std::basic_istream<>` etc., you must include typedefs for `pos_type` and `off_type` (and a lot of other data types), and ensure they comply with §27.2.2 and §27.3 of the standard.

Problem

What are the differences between `streampos` and `pos_type`, `streamoff` and `off_type`, except they are defined differently. What should I use with the `basic_stream<>::seek`'s functions?

Original source