txt resueltos programacion por manejo linea libreria leer guardar ficheros ejercicios datos binarios archivos archivo c++ file-io iostream

resueltos - manejo de archivos en c++ fstream



Lectura de archivos de más de 4 GB con c++ stl (5)

Desde el punto de vista estándar, no hay nada que lo impida. Sin embargo, en realidad, la mayoría de las implementaciones de 32 bits usan 32 bits para std::size_t . Ahora, el estándar de C ++ exige que el asignador estándar en la biblioteca estándar de C ++ use std :: size_t como la cantidad de tamaño. Por lo tanto, está limitado a 2 ^ 32 bytes de almacenamiento para contenedores, cadenas y demás. La situación podría ser otra para std::off_t , no sé exactamente qué está pasando allí.

Debe poder utilizar directamente la API nativa del sistema operativo o alguna biblioteca que lo cubra para poder hacerlo, sin tener que confiar en las implementaciones de la Biblioteca estándar, que dependen en gran medida de la implementación.

Hace unas semanas estaba usando std :: ifstream para leer en algunos archivos y estaba fallando inmediatamente en abierto porque el archivo era más grande que 4GB. En ese momento no pude encontrar una respuesta decente sobre por qué estaba limitado a los tamaños de archivos de 32 bits, así que escribí el mío usando la API del sistema operativo nativo.

Entonces, mi pregunta es: ¿hay alguna manera de manejar archivos de más de 4 GB de tamaño usando std :: ifstream / std :: ostream (IE: estándar c ++)

EDITAR: Usar la implementación de STL del compilador de VC 9 (Visual Studio 2008). EDIT2: seguramente tiene que haber una forma estándar de admitir archivos de más de 4 GB.


Me encontré con este problema hace varios años usando gcc en Linux. El sistema operativo admitía archivos de gran tamaño, y la biblioteca de C (fopen, etc.) la admitía, pero la biblioteca estándar de C ++ no. Resulté que tenía que volver a compilar la biblioteca estándar de C ++ con los indicadores del compilador correctos.


Aparentemente depende de cómo off_t sea ​​implementado por la biblioteca.

#include <streambuf> __int64_t temp=std::numeric_limits<std::streamsize>::max();

te da el máximo actual.

STLport admite archivos más grandes.


Si puede alejarse de usar solo C ++ estándar, entonces podría estar interesado en boost :: iostreams .


Al menos en VS2013, el filesystem estándar de C ++ funciona bien con archivos grandes (> 4GBytes).

Probé en VS2013 (con actualización3).

int64_t file_pos = 4LL * 1024 * 1024 * 1024 + 1; file.seekp( file_pos, SEEK_SET ); assert( file ); cout << "cur pos: " << file.tellp() << endl; // the output is: 4294967297(4GB + 1)

El siguiente enlace es una confirmación adicional de que se trata de un error y se ha corregido: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32- bit - int - as - pos- plataforma type-even-on-x64

para abreviar: dijo Stephan T. Lavavej (Desarrollador de Bibliotecas de Visual C ++)

Lo hemos corregido, y la solución estará disponible en VC11 ... por lo que el soporte de archivos grandes debería funcionar correctamente ahora (independientemente de la plataforma x86 / x64)