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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top