2009-04-08 26 views
21

Ich habe ein kurzes C-Programm, das in eine Datei schreibt, bis kein Platz mehr auf der Festplatte ist:2 GB Dateigröße bei der Verwendung von fwrite 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; 
} 

Wenn ich das Programm (in Linux) laufen, stoppt es, wenn die Datei 2 GB erreicht.

Gibt es eine interne Einschränkung aufgrund der FILE-Struktur oder etwas?

Danke.

+2

Das klingt wie die positive 1/2 einer 32-Bit-Ganzzahl. –

+0

In welches Dateisystem ist Ihre Festplatte formatiert? – eduffy

+0

Linux sagt "vfat", was FAT32 ist denke ich. Es ist ein 4GB Flash-Laufwerk, das zunächst (fast) leer ist. – Gabriel

Antwort

27

Bei einem 32-Bit-System (dh das Betriebssystem ist 32 Bit) sind fopen und co standardmäßig auf 32 Bit Größe/Offset/etc ... beschränkt. Sie müssen die Unterstützung großer Dateien aktivieren oder die * 64-Bit-Option:

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

Dann braucht Ihre fs dies zu unterstützen, aber außer Fett und anderen primitiven fs, alle von ihnen unterstützen Erstellen von Dateien> 2 GB.

12

Es stoppt, wenn die Datei 2 GB erreicht.

Gibt es eine interne Begrenzung, fällig auf die Dateistruktur, oder etwas?

Dies ist aufgrund der libc (die Standard-C-Bibliothek), die auf einem x86 standardmäßig (IA-32) Linux-System 32-Bit-Funktionen versehen sind von glibc (GNU C Library). Standardmäßig basiert file stream size auf 32-Bit - 2^(32-1).

Informationen zur Verwendung von Large File Support finden Sie auf der Webseite.

Hinweis: Die meisten Systeme erwarten, dass fopen (und off_t) auf der Dateigröße von 2^31 basiert. Ersetzen sie mit off64_t und fopen64 macht dies explizit, und je nach Verwendung könnte der beste Weg zu gehen. wird aber im Allgemeinen nicht empfohlen, da sie nicht standard sind.

+3

ermöglichen Nie die * 64 Funktionen verwenden. Kompiliere immer alle Programme mit '-D_FILE_OFFSET_BITS = 64'. –

+0

Größtenteils einverstanden, da die * 64-Funktionen nicht portierbar sind und in keinen Standards gut definiert sind, aber sie machen die Anforderung explizit, was in einigen wenigen Fällen gut sein kann. – mctylr

Verwandte Themen