2009-04-08 9 views
21

Ho un programma breve C che scrive in un file fino a quando non v'è più spazio su disco:Limite di 2 GB alle dimensioni del file quando si utilizza il metodo di scrittura in 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; 
} 

Quando eseguo il programma (in Linux), si ferma quando il file raggiunge 2 GB.

C'è una limitazione interna, dovuta alla struttura FILE, o qualcosa del genere?

Grazie.

+2

Sembra il 1/2 positivo di un numero intero a 32 bit. –

+0

Quale file system ha il tuo disco rigido formattato come? – eduffy

+0

Linux dice "vfat", che è FAT32, penso. È un'unità flash da 4 GB, che è inizialmente (quasi) vuota. – Gabriel

risposta

27

Su un sistema a 32 bit (ovvero il sistema operativo è a 32 bit), per impostazione predefinita, fopen e co sono limitati a 32 bit dimensione/offset/ecc ... È necessario abilitare il supporto file di grandi dimensioni, oppure utilizzare il * opzione 64 bit:

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

Allora il tuo fs ha bisogno di sostenere questo, ma ad eccezione di grassi e altri fs primitivi, tutti supportano la creazione di file> 2 gb.

12

si arresta quando il file raggiunge 2 GB.

Esiste una limitazione interna, dovuta a alla struttura FILE, o qualcosa del genere?

Ciò è dovuto alla libc (la libreria standard C), che di default su un x86 (IA-32) Sistema di Linux è funzioni a 32 bit fornite da glibc (C Library di GNU). Quindi, per impostazione predefinita, file stream size si basa su 32-bit - 2^(32-1).

Per l'utilizzo di Large File Support, consultare la pagina Web.

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

Nota: la maggior parte dei sistemi prevede che fopen (e off_t) si basino sul limite di dimensioni del file 2^31. Sostituirli con off64_t e fopen64 rende esplicito, e, a seconda dell'utilizzo, potrebbe essere il modo migliore per andare. ma non è raccomandato in generale in quanto non standard.

+3

Non utilizzare mai le funzioni * 64. Compila sempre tutti i programmi con '-D_FILE_OFFSET_BITS = 64'. –

+0

Principalmente d'accordo, poiché le funzioni * 64 non sono portatili e non sono ben definite in nessuno standard, ma rendono esplicito il requisito che può essere buono in alcuni casi limitati. – mctylr

Problemi correlati