sirve - long long c++ range
¿Está std:: streampos garantizado como sin firmar por mucho tiempo? (2)
¿Está std::streampos
garantizado como unsigned long long
?
Si no es así, ¿cómo funciona std::istream::seekg
correctamente en archivos mayores que 4G?
De http://en.cppreference.com/w/cpp/io/fpos :
std::streampos
es una especialización de la plantilla de clase
template< class State > class fpos;
std::streampos
es typedef''ed para ser std::fpos<std::char_traits<char>::state_type>
Cada objeto de tipo fpos
mantiene la posición de bytes en la secuencia (generalmente como un miembro privado del tipo std::streamoff
).
De http://en.cppreference.com/w/cpp/io/streamoff :
El tipo std::streamoff
es un tipo integral firmado de tamaño suficiente para representar el tamaño máximo de archivo posible admitido por el sistema operativo. Por lo general, este es un tipo de long long
.
Para responder tu pregunta...
Pregunta ¿ std::streampos
garantiza que std::streampos
estará unsigned long long
?
Respuesta Estoy seguro de que quería saber si el tipo integral subyacente que ocupa la posición está garantizado como unsigned long long
. En ese sentido, la verdadera pregunta es si std::streamoff
está garantizado como unsigned long long
. La respuesta a esa pregunta es "No", como puede inferir de las descripciones anteriores.
Pregunta Si no es así, ¿cómo funciona std::istream::seekg
correctamente en archivos de mayor tamaño que 4G?
Respuesta Si un sistema operativo admite trabajar con archivos de más de 4G, std::streamoff
se tipifica como corresponde. Incluso entonces, es probable que sea un tipo integral firmado. Aquí hay otra cita de http://en.cppreference.com/w/cpp/io/streamoff .
Un valor de std :: streamoff de -1 también se usa para representar condiciones de error en algunas de las funciones de la biblioteca de E / S.
No, no está garantizado que unsigned long long
esté unsigned long long
.
Especialmente con compiladores más antiguos, puede no funcionar con archivos de más de 4 GB (y en algunos casos fue firmado, por lo que solo funcionaba con archivos de hasta 2 GB, pero cuando los discos duros típicos eran de 20 a 40 megabytes, probablemente no parecía una consideración importante).