Ограничение на размер файла в 2 ГБ при использовании fwrite в C?

StackOverflow https://stackoverflow.com/questions/730709

  •  06-09-2019
  •  | 
  •  

Вопрос

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

#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 ГБ.

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

Спасибо.

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

Решение

В 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 гб.

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

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

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

Это связано с libc (стандартной библиотекой C), которая по умолчанию в системе Linux x86 (IA-32) представляет собой 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 делает это явным, и в зависимости от использования это может быть лучшим выходом. но в целом это не рекомендуется, так как они нестандартны.

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