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.

Foi ú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;

}

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