Pergunta

Algumas semanas atrás eu estava usando std :: ifstream ler em alguns arquivos e estava falhando imediatamente em aberto porque o arquivo foi maior do que 4 GB. Na época, eu não poderia encontrar uma resposta decente a respeito de porque ele foi limitado a 32 tamanhos de arquivos bit, então eu escrevi meu próprio usando API OS nativo.

Então, minha pergunta então: Existe uma maneira de arquivos punho maiores do que 4 GB de tamanho usando std :: ifstream / std :: ostream (IE: C ++ padrão)

EDIT: Usando a implementação STL do compilador VC 9 (Visual Studio 2008). EDIT2:. Certamente tem que haver maneira padrão de arquivo de suporte tamanhos maiores do que 4GB

Foi útil?

Solução

Aparentemente, isso depende de como off_t é implementado pela biblioteca.

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

dá-lhe o que o máximo atual é.

STLport suporta arquivos maiores.

Outras dicas

Eu corri para este problema há vários anos usando gcc no Linux. O sistema operacional suportado arquivos grandes, e a biblioteca C (fopen, etc) apoiaram, mas a biblioteca C ++ padrão não. I-se que eu tinha que recompilar a biblioteca C ++ padrão usando as bandeiras de compilador correto.

Do ponto de vista padrão, não há nada que impeça isso. No entanto, na realidade, a maioria das implementações de 32 bits usar 32 bits para std::size_t. Agora, o C ++ mandatos padrão que o alocador padrão nos usos biblioteca padrão C ++ std :: size_t como a quantidade tamanho. Assim, está limitado a 2 ^ 32 bytes de armazenamento para recipientes, cordas e o material. A situação poderia ser outro para std::off_t, eu não sei exatamente o que está acontecendo lá.

Você tem que usar a API nativa do OS diretamente, ou algum embrulho biblioteca, para ser capaz de fazer isso, sem ter que confiar nas implementações de biblioteca padrão, que são em grande parte dependente de implementação.

Se você pode mover-se longe usando apenas C ++ padrão, então você pode estar interessado em boost :: iostreams .

Pelo menos no VS2013, o filestream C ++ padrão trabalha com arquivos grandes (> 4GBytes) também.

Eu testei no VS2013 (com 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)

O link a seguir é uma confirmação adicional de que é um bug e foi corrigido: https://connect.microsoft.com/VisualStudio/feedback/details/627639/std-fstream-use-32-bit-int-as-pos-type-even-on-x64-platform

para breve: Stephan T. Lavavej (Visual C ++ Bibliotecas desenvolvedor) disse

Nós fixa-lo, e a correção estará disponível em VC11 ... tão grande suporte de arquivo deve funcionar corretamente agora (independentemente de x86 / plataforma x64)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top