Ограничение 2GB на размер файла при использовании fwrite в 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 ГБ.
Есть ли внутреннее ограничение из-за структуры FILE или что-то еще?
Спасибо.
Ответы
Ответ 1
В 32-битной системе (то есть ОС 32 бит) по умолчанию fopen и co ограничены размером 32 бита/смещением/etc... Вам нужно включить поддержку большого файла или использовать * 64 бит:
http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
Затем ваши fs должны поддерживать это, но кроме жира и других примитивных fs, все они поддерживают создание файлов > 2 gb.
Ответ 2
он останавливается, когда файл достигает 2 ГБ.
Есть ли внутреннее ограничение, должное к структуре FILE или что-то еще?
Это связано с libc (стандартная библиотека C), которая по умолчанию в системе x86 (IA-32) Linux представляет собой 32-битные функции, предоставляемые glibc (библиотека GNU C). Таким образом, по умолчанию размер файла основан на 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
делает это явным, и в зависимости от использования может быть лучшим способом., но не рекомендуется вообще, поскольку они нестандартны.