Größe einer Datei bestimmen
-
FILE * ipf = fopen(filename, "r"); //determine the size of the file to allocate memory fseek(ipf,0,SEEK_END); long fileSize = ftell(ipf); fseek(ipf,0,SEEK_SET); data = getMemory(fileSize); //read content of file to memory long newFileSize = fread (&data[0],1,fileSize,ipf);
Bei einer Testdatei erhalte ich folgende Werte:
fileSize 650975
newFileSize 632213Kann man irgendwie ohne die Daten mit fread zu lesen schon vorab bestimmen wie groß die Datei ist? Bin ich mit eine C++ Lösung einverstanden.
-
Öffne die Datei mal im binary-Mode.
-
macht auch keinen Unterschied
unsigned long fsize(const char* file) { FILE * f = fopen(file, "rb"); fseek(f, 0, SEEK_END); unsigned long len = (unsigned long)ftell(f); fclose(f); return len; }
liefert 650975, für sehr kleine Dateien liefert die obige Funktionen richtige Werte
-
Und
&data[0]
ist nicht falsch, aber etwas befremdlich.
Da ist einfachdata
ausreichend und üblich. (Du hast da auch kein Array)
-
Vertexwahn schrieb:
macht auch keinen Unterschied
unsigned long fsize(const char* file) { FILE * f = fopen(file, "rb"); fseek(f, 0, SEEK_END); unsigned long len = (unsigned long)ftell(f); fclose(f); return len; }
liefert 650975, für sehr kleine Dateien liefert die obige Funktionen richtige Werte
Wie stellst du fest, was "richtig" ist?
-
Vertexwahn schrieb:
macht auch keinen Unterschied
...
liefert 650975, für sehr kleine Dateien liefert die obige Funktionen richtige WerteUnd was liefert das fread im binary-mode?
-
Danke für die Hilfe - im binary mode wird mir jedes mal 650975 geliefert
-
Windows erkennt das Zeichen 0x1A (Ctrl-Z) als EOF (im nicht binary-Modus)
-
DirkB schrieb:
Windows erkennt das Zeichen 0x1A (Ctrl-Z) als EOF (im nicht binary-Modus)
Das sollte aber das fread nicht stören, oder? Das fread liefert einen anderen Wert, weil die newlines konvertiert werden.
-
ftell+SEEK_END+Binary-Modus liefert undefiniertes Verhalten.
Verwende die nicht C-Standard Funktion stat mit st_size.
-
Eine denkbare Alternative wäre noch die Datei mit
FILE * f = fopen(file, "ab");zu öffnen.
Danach kann man die Position des Filepointers (Dateiende) ermitteln.