2009-04-08 16 views
21

Mam krótki program w C, który zapisuje w pliku, dopóki nie ma więcej miejsca na dysku:Ograniczenie rozmiaru pliku 2 GB przy użyciu fwrite w 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; 
} 

Kiedy uruchamiam program (w Linuksie), zatrzymuje się, gdy plik osiągnie 2 GB.

Czy istnieje wewnętrzne ograniczenie ze względu na strukturę PLIKU, czy coś?

Dzięki.

+2

To brzmi jak dodatnia 1/2 32-bitowej liczby całkowitej. –

+0

Który system plików jest sformatowany na dysku twardym? – eduffy

+0

Linux mówi "vfat", czyli chyba FAT32. Jest to dysk flash 4 GB, który jest początkowo (prawie) pusty. – Gabriel

Odpowiedz

12

zatrzymuje się, gdy plik osiągnie 2 GB.

Czy istnieje wewnętrzne ograniczenie, z powodu do struktury pliku, czy coś?

Jest to spowodowane libc (standardowa biblioteka C), która domyślnie w systemie Linux x86 (IA-32) jest 32-bitowymi funkcjami dostarczanymi przez glibc (biblioteka C GNU). Domyślnie file stream size opiera się na 32-bitach - 2^(32-1).

Informacje na temat korzystania z Large File Support można znaleźć na stronie internetowej.

#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; 
} 

Uwaga: Większość systemów oczekuje, że fopen (i off_t) będą oparte na limicie rozmiaru 2^31. Zastępowanie ich za pomocą off64_t i fopen64 powoduje, że jest to wyraźne, iw zależności od sposobu użycia może to być najlepsza droga., ale ogólnie nie jest to zalecane, ponieważ są niestandardowe.

+3

Nigdy nie używaj funkcji * 64. Zawsze kompiluj wszystkie programy za pomocą '-D_FILE_OFFSET_BITS = 64'. –

+0

Większość uzgodnionych, ponieważ funkcje * 64 nie są przenośne i nie są dobrze zdefiniowane w żadnych standardach, ale jasno określają wymagania, które mogą być dobre w niektórych ograniczonych przypadkach. – mctylr

Powiązane problemy