Dateien die größer als 2 GB sind
-
Hallo,
ich versuche seit geraumer Zeit eine Datei einzulesen, die größer ist als 2 GB. Da spuckt die meiner Meinung nach in Frage kommenden Funktion fopen() und ftell() machen aber Zicken! Wie kann ich die Größe einer solchen Datei exakt bestimmen?
#include <stdio.h> int main(void) { FILE *stream; char ch; unsigned long var = 0; stream = fopen("test.txt", "r"); fseek(stream, 0L, SEEK_END); var = ftell(stream); printf("Der Dateizeiger ist auf Byte %ld\n", var); fclose(stream); return 0; }
Er gibt bei zu großen Dateien dann ein Segmentation fault. Kann mir jemand helfen, wie ich das mache? Mindestens bis 4 GB sollte ich doch kommen können, oder?
Falls es von Belang ist: Ich nutze gcc:4.1, OS:Kubuntu, 32-Bit-Rechner.
Danke,
Paul
-
Dazu brauchst Du nur man: stat(2), dann kann fast nichts schiefgehen.
-
Danke, danke, danke! Es funktioniert wirklich. Für all die anderen armen Leute, die sich schon die Haare gerauft haben, hier der kurze Quelltext mit der Lösung.
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> int main(void) { unsigned long var = 0; struct stat file_info; stat("./test.text", &file_info); var = file_info.st_size; // hier gibt es noch eine Reihe anderer Möglichkeiten printf("Der Dateizeiger ist auf Byte %ul\n", var); return 0; }
-
Btw, wenn Du C++ verwendest, könnte Dich uU boost::filesystem interessieren.
-
Also für 64-Bit-Dateien gibt es stat64.
Die Variable stat.st_size ist vom Typ off_t, was als vorzeichenbehafteter long defineirt ist. Das hat nur einen Wertebereich bis zur 2G-Grenze. Daß Dein Programm funktioniert, ist nur Zufall.
Stat64 hat einen stat64.st_size vom Typ off64_t. Das brauchst Du allerdings einen anderen printf-Formatstring. Einfacher geht das mit den iostreams in C++. Aber das ist eine andere Geschichte.
Tntnet
-
Wenn das Basissystem entsprechend konfiguriert ist, sind off_t und off64_t aber auch identisch.
-
Ich erlaube mir an dieser Stelle die Fragestellung zu erweitern
Ich möchte schlicht und ergreifend die Dateigröße einer z.B. 15GB Datei ermitteln (um im Anschluss dann auch darauf zuzugreifen.
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <sys/stat.h> int main(void) { struct stat file_info; unsigned long long int ull_filesize; stat("datei", &file_info); ull_filesize = file_info.st_size; printf("%lld\n", (ull_filesize)); }
Ausgabe ist immer "922822844". Ich vermute es liegt daran, dass st_size auf 4 Bit beschränkt ist. Lösungsvorschläge?
Vielen Dank.
-
@Frank S.
Lies doch bitte vorher die bereits gegebenen Antworten. Siehe zB tntnets Beitrag!btw. folgender Link dürfte interessant sein, ist aber schon älter, daher weiß ich nicht wie relevant das noch ist http://www.suse.de/~aj/linux_lfs.html