Is std::streampos guaranteed to be unsigned long long?

c++, file, integer, types, unsigned-long-long-int

Solution

From http://en.cppreference.com/w/cpp/io/fpos:

`std::streampos` is a specialization of the class template

template< class State > class fpos;

`std::streampos` is typedef'ed to be `std::fpos<std::char_traits<char>::state_type>`

Each object of type `fpos` holds the byte position in the stream (typically as a private member of type `std::streamoff`).

From http://en.cppreference.com/w/cpp/io/streamoff:

The type `std::streamoff` is a signed integral type of sufficient size to represent the maximum possible file size supported by the operating system. Typically, this is a typedef to `long long`.

To answer your questions...

Question Is `std::streampos` guaranteed to be `unsigned long long`?

Answer I am sure you meant to find out whether the underlying integral type that holds the position is guaranteed to be `unsigned long long`. In that sense, the real question is whether `std::streamoff` is gueranteed to be `unsigned long long`. The answer to that question is "No", as you can infer from the descriptions above.

Question If not so, how does `std::istream::seekg` work correctly on files larger than 4G?

Answer If an operating system supports working with files larger than 4G, it's `std::streamoff` is typdef'ed accordingly. Even then, it is most likely going to be a signed integral type. Here's another quote from http://en.cppreference.com/w/cpp/io/streamoff.

A std::streamoff value of -1 is also used to represent error conditions by some of the I/O library functions.

Problem

Is `std::streampos` guaranteed to be `unsigned long long`? If not so, how does `std::istream::seekg` work correctly on files larger than 4G?

Original source