Вопрос

Я пытаюсь найти окончательный ответ и не могу, поэтому надеюсь, что кто-нибудь может знать.

Я разрабатываю приложение на C ++ с использованием GCC 4.x в Linux (32-разрядная ОС).Это приложение должно иметь возможность читать файлы размером более 2 ГБ.

Я бы действительно хотел использовать материал iostream противУказатели на файлы, но я не могу найти, влияет ли большой файл #defines (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE, _FILE_OFFSET_BITS=64) на заголовки iostream.

Я компилирую на 32-разрядной системе.Любые указания были бы полезны.

Это было полезно?

Решение

Это уже было решено за вас , когда libstdc++ был скомпилирован и обычно зависит от того, был ли _GLIBCXX_USE_LFS был определен в c++config.h.

Если вы сомневаетесь, передайте свой исполняемый файл (или libstdc++.so, если привязка к нему выполняется динамически) через readelf -r (или через strings) и посмотрите, является ли ваш двоичный/libstdc++ связанный с fopen/fseek/и т.д.или fopen64/fseek64/и т.д.

Обновить

Вам не нужно беспокоиться о лимите в 2 ГБ до тех пор, пока вам не нужно / пытаться fseek или ftell (вы просто читаете из потока или записываете в него.)

Другие советы

Если вы используете GCC, вы можете воспользоваться расширением GCC под названием __gnu_cxx::stdio_filebuf, которое привязывает IOStream к стандартному C ФАЙЛ дескриптор.

Вам нужно определить следующие две вещи:

_БОЛЬШОЙ ФАЙЛ_ИСТОЧНИКА

_FILE_OFFSET_BITS=64

Например:

#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;

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top