2009-04-08 5 views
21

У меня есть короткая программа C, которая записывает в файл, пока не будет не больше места на диске:ограничение 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 или что-то еще?

Спасибо.

+2

Звучит как положительная 1/2 32-битного целого. –

+0

Какая файловая система является вашим жестким диском, отформатированным как? – eduffy

+0

Linux говорит «vfat», который, как мне кажется, FAT32. Это флеш-накопитель на 4 ГБ, который изначально (почти) пуст. – Gabriel

ответ

27

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

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

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

12

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

Есть внутреннее ограничение, из-за в структуру FILE, или что-то еще?

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

Для использования Large File Support, см. Веб-страницу.

#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 делает это явным, и в зависимости от использования может быть лучшим способом., но не рекомендуется в целом, поскольку они являются нестандартными.

+3

Никогда не используйте функции * 64. Всегда компилируйте все программы с помощью '-D_FILE_OFFSET_BITS = 64'. –

+0

В основном согласен, так как функции * 64 не являются переносимыми и не определены в каких-либо стандартах, но они делают требование явным, которое может быть хорошим в некоторых ограниченных случаях. – mctylr

Смежные вопросы