Ограничение на размер файла в 2 ГБ при использовании fwrite в C?
-
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
делает это явным, и в зависимости от использования это может быть лучшим выходом. но в целом это не рекомендуется, так как они нестандартны.