2 ГБ ограничение на размер файла при использовании fwrite в C? - PullRequest
21 голосов
/ 08 апреля 2009

У меня есть короткая программа на C, которая записывает в файл, пока на диске больше нет места:

#include <stdio.h>

int main(void) {
  char c[] = "abcdefghij";
  size_t rez;
  FILE *f = fopen("filldisk.dat", "wb");
  while (1) {
    rez = fwrite(c, 1, sizeof(c), f);
    if (!rez) break;
  }
  fclose(f);
  return 0;
}

Когда я запускаю программу (в Linux), она останавливается, когда файл достигает 2 ГБ.

Есть внутреннее ограничение из-за структуры ФАЙЛ или что-то еще?

Спасибо.

Ответы [ 2 ]

27 голосов
/ 08 апреля 2009

В 32-битной системе (т. Е. ОС 32-битная), по умолчанию fopen и co ограничены размером 32 бита / смещением / и т. Д. Вам необходимо включить поддержку больших файлов или использовать * 64 опция битов:

http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931

Тогда ваш fs должен поддерживать это, но, кроме fat и других примитивных fs, все они поддерживают создание файлов> 2 ГБ.

12 голосов
/ 09 апреля 2009

останавливается, когда размер файла достигает 2 ГБ.

Есть ли внутреннее ограничение из-за в структуру ФАЙЛ, или что-то?

Это происходит из-за libc (стандартной библиотеки C), которая по умолчанию в системе x86 (IA-32) Linux представляет собой 32-битные функции, предоставляемые glibc (GNU's C Library). Таким образом, по умолчанию размер файлового потока основан на 32-битном коде - 2 ^ (32-1).

Для использования Поддержка больших файлов см. Веб-страницу.

#define _FILE_OFFSET_BITS  64
/* or more commonly add -D_FILE_OFFSET_BITS=64 to CFLAGS */

#include <stdio.h>

int main(void) {
  char c[] = "abcdefghij";
  size_t rez;
  FILE *f = fopen("filldisk.dat", "wb");
  while (1) {
    rez = fwrite(c, 1, sizeof(c), f);
    if ( rez < sizeof(c) ) { break; }
  }
  fclose(f);
  return 0;
}

Примечание. Большинство систем ожидают, что fopen (и off_t) будут основаны на ограничении размера файла 2 ^ 31. Замена их на off64_t и fopen64 делает это явным, и, в зависимости от использования, может быть лучшим способом. , но в целом не рекомендуется, поскольку они нестандартны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...