iostream e suporte de arquivo grande
-
20-08-2019 - |
Pergunta
Eu estou tentando encontrar uma resposta definitiva e não pode, por isso estou esperando que alguém poderia saber.
Estou desenvolvendo um C ++ aplicativo usando GCC 4.x no Linux (32-bit OS). Este aplicativo precisa ser capaz de ler arquivos> 2GB de tamanho.
Eu realmente gosto de usar iostream ponteiros coisas vs. arquivo, mas não consigo encontrar, se as grandes #defines arquivo (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS = 64) tem qualquer efeito sobre os cabeçalhos iostream.
Estou compilando em um sistema de 32 bits. Os ponteiros seria útil.
Solução
Esta já foi decidido para você quando libstdc++
foi compilado, e normalmente depende ou não _GLIBCXX_USE_LFS
foi definida em c++config.h
.
Em caso de dúvida, passar o seu executável (ou libstdc++.so
, se ligando contra ele dinamicamente) através readelf -r
(ou através strings
) e veja se o seu binário / libstdc++
ligado contra fopen
/ fseek
/ etc. ou fopen64
/ fseek64
/ etc.
Atualizar
Você não tem que se preocupar com o limite de 2 GB, enquanto você não precisa / tentativa de fseek
ou ftell
(você acabou de ler ou escrever para o fluxo.)
Outras dicas
Se você estiver usando GCC, você pode tirar vantagem de uma extensão do GCC chamado __gnu_cxx :: stdio_filebuf, que amarra um iostream a um padrão C arquivo descritor.
Você precisa definir as duas coisas seguintes:
_LARGEFILE_SOURCE
_FILE_OFFSET_BITS = 64
Por exemplo:
#include <cstdio>
#include <fstream>
#include <ext/stdio_filebuf.h>
int main()
{
std::ofstream outstream;
FILE* outfile;
outfile = fopen("bigfile", "w");
__gnu_cxx::stdio_filebuf<char> fdbuf(outfile, std::ios::out |
std::ios::binary);
outstream.std::ios::rdbuf(&fdbuf);
for(double i = 0; i <= 786432000000.0; i++) {
outstream << "some data";
fclose(outfile);
return 0;
}