2008-11-16 19 views
16

Hace unas semanas estaba usando std :: ifstream para leer en algunos archivos y estaba fallando inmediatamente en abrir 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.Leyendo archivos de más de 4 GB usando C++ stl

lo tanto, mi pregunta entonces: ¿Hay una manera de manejar archivos de más de 4 GB de tamaño usando std :: ifstream/std :: ostream (IE: C++ estándar)

EDIT: Uso de la aplicación de la STL Compilador VC 9 (Visual Studio 2008). EDIT2: Seguramente tiene que haber una forma estándar de admitir archivos de más de 4 GB.

+0

STL no es especialmente relevante para esta pregunta; eliminarlo? Sugeriría que iostreams es el nombre de la parte de la biblioteca estándar de C++ de la que está hablando. – Alastair

+0

Reetiquetado como sugirió Alastair. Y para responder, la norma no dice nada sobre cómo se deben admitir los archivos de gran tamaño, o qué tan grande debería ser size_t.Está completamente definido por la implementación. Entonces, ¿qué implementación estás usando? – jalf

+0

El título de la pregunta también necesita edición. –

Respuesta

13

Aparentemente, depende de cómo la biblioteca implemente off_t.

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

le indica cuál es la corriente máxima.

STLport admite archivos de mayor tamaño.

5

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.

+1

Estoy contigo KeithB, esto tiene _NOTHING_ todo con cualquier problema de MSVC/STL u otro, es un problema de implementación del sistema. El código fuente de las bibliotecas CRT/STL se incluye con el compilador por una razón, es posible que deba # definir la macro apropiada del preprosessor para obtener la funcionalidad deseada. NO es que la implementación de la biblioteca sea una u otra (por ejemplo * nix usando fgetpos o fgetpos64 para archivos de> 32 bits de tamaño), la biblioteca admite AMBAS, le corresponde al desarrollador usar correctamente la biblioteca. Usar STLPort es lo mismo que recompilar MSVC STL de todos modos, ambos implican un poco de ajustes manuales – RandomNickName42

2

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 utilizar la API nativa del sistema operativo directamente, o alguna biblioteca que lo ajuste, para poder hacer eso, sin tener que confiar en las implementaciones de la Biblioteca estándar, que dependen en gran medida de la implementación.

+0

Terminé envolviendo la API del sistema operativo directamente para el caso en que el tamaño de mi archivo era más grande que 4 gb – Raindog

0

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

0

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

He probado en VS2013 (con update3).

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 es un error y se ha resuelto: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32-bit-int-as-pos-type-even-on-x64-platform

para abreviar: Stephan T. Lavavej (Visual Bibliotecas C++ Developer) dicho

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

Cuestiones relacionadas