Как правильно обрабатывать большие файлы (4+ ГБ) в C ++? - PullRequest
0 голосов
/ 16 января 2019

В моей карьере мне никогда не приходилось иметь дело с такими большими файлами, как центральный аспект моего приложения, и я немного озадачен.

Мое приложение будет записывать много вещей в файл, и оно может увеличиться до нескольких гигабайт. Приложение должно работать в Windows (начиная с 7) и во всех современных Linux (начиная с ядра 4) для 32-разрядных и 64-разрядных компьютеров

Я пытался использовать fread и друзей, поскольку они портативны, но все они используют long. Я размышлял о том, чтобы разделить файл на несколько файлов размером 2 ГБ, чтобы продолжить работу со знаком long, но это кажется слишком сложным при обработке.

Существует ли набор функций переносимых библиотек, которые помогут с этой задачей, или мне нужно написать тонкую оболочку для API платформы?


РЕДАКТИРОВАТЬ: Чтобы ответить на некоторые вопросы в комментарии.

  1. Это двоичный файл данных.
  2. Мне не нужно загружать все это в память, но мне придется искать смещения.
  3. Что касается использования fstream, похоже, что оно не будет работать на основе этого , поэтому я не стал его учитывать.

1 Ответ

0 голосов
/ 16 января 2019

Я не думаю, что вы можете сделать это переносимо, но этот обходной путь может помочь (не проверено).

#include <stdint.h>
#include <stdio.h>
#ifdef _MSC_VER
inline int seek64( FILE *stream, int64_t offset, int origin )
{
    return _fseeki64( stream, offset, origin );
}
#else
#define _LARGEFILE64_SOURCE
#include <sys/types.h>
#include <unistd.h>
inline int seek64( FILE *stream, int64_t offset, int origin )
{
    const int fd = fileno( stream );
    return (int)lseek64( fd, offset, origin );
}
#endif
...