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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…