2 GB Grenze für die Dateigröße, wenn fwrite in C verwendet?
-
06-09-2019 - |
Frage
Ich habe ein kurzes C-Programm, das in eine Datei schreibt, bis kein Platz mehr auf der Festplatte ist:
#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 Begrenzung aufgrund der Dateistruktur oder etwas?
Danke.
Lösung
Auf einem 32-Bit-System (dh die OS 32 Bit), die standardmäßig fopen und Co sind begrenzt auf 32 Bit Größe / Offset / etc ... Sie benötigen die Unterstützung für große Dateien zu aktivieren, oder die * 64 verwenden Bits Option:
http: // www. gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
Dann wird Ihr fs muss dies unterstützen, aber außer Fett und andere primitive fs, alle von ihnen unterstützen Dateien> 2 GB zu schaffen.
Andere Tipps
es stoppt, wenn die Datei 2 GB erreicht.
Gibt es eine interne Begrenzung auf Grund auf die Dateistruktur, oder was?
Dies ist aufgrund der libc (die Standard-C-Bibliothek), die standardmäßig auf einem x86 (IA-32) Linux-System ist 32-Bit-Funktionen von glibc bereitgestellt (GNU C Library). So standardmäßig die Datei-Stream Größe basiert auf einem 32-Bit -. ^ 2 (32-1)
Für die Verwendung von Large File Support finden Sie auf der Web-Seite.
#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;
}
Hinweis: Die meisten Systeme erwarten fopen (und off_t) auf 2 ^ 31 Dateigrößenbeschränkung basieren. Ersetzen sie mit off64_t
und fopen64
macht dies explizit, und je nach Nutzung könnte bester Weg zu gehen. ist aber nicht generell empfohlen, da sie nicht-Standard sind.