programm kommt mit binären dateien nicht zurecht
-
Herr-Vorragend schrieb:
hm, jetzt ist das programm viel langsamer, wenn ich short nehme, bei int stürzt er sogar irgendwann ab, gibt es denn keine andere möglichkeit??
es muss int sein. wenn es abstürtzt, dann nicht in dem gezeigten code.
-
hm, okay.
die schleife fügt allerdings auch immer das eingelesene zeichen in einen zeichenbuffer ein, also sowas wie
buffer[i] = c;
muss dann der buffer auch ein int-array sein? das wär nämlich ziemlich unpraktisch, weil auch als char-array schon ziemlich viel platz im speicher belegt...
-
hi,
also wenn ich mich auch mal beteiligen darf.
oeffnest du die datei binaer?
fopen("binary.dat", "rb");gruss
msp
-
jupp, deswegen hab ich auch nicht verstanden wieso es nicht funktioniert ^^
-
binaries sollte man auch nicht mit fgetc lesen oder sonstige solche Funktionen. man: fread(3) ist besser dazu geeignet
-
supertux: Woher hast du diese Weisheit?
Herr-Vorragend: Überleg mal so. Wenn es in der Datei alle 256 verschiedenen Zeichen vorkommen können, und du diese jeweils in einen Datentyp mit 256 verschiedenen Werten speicherst, welchen Wert soll dann EOF haben? Es sollte ja auf jeden Fall einen Wert haben, der nicht in der Datei vorkommt, d.h. char reicht nicht mehr aus. Man hat sich damals für int entschieden, und fgetc gibt auch int zurück. Dein buffer muss natürlich nicht als int deklariert sein, da speicherst du das EOF-Symbol ja nicht mit rein.
-
okay, danke, habs verstanden. aber short geht auch nicht, oder? dann müsste man den speicher "nur" verdoppeln
-
Herr-Vorragend schrieb:
okay, danke, habs verstanden. aber short geht auch nicht, oder? dann müsste man den speicher "nur" verdoppeln
nee, du liest immer 'ints', solange die nicht EOF (== -1) sind, werden die als 'char' abgespeichert (es sind nur die unteren 8 bits gültig). kommt EOF brichste ab, fertig
-
hö? also muss mein buffer doch nicht ein int-array sein?
-
Eine short müsste zwar gehen, ist aber unsauber und hast du wirklich so wenig Platz? Auf den meisten PCs gibt's eh das 4er Alignment bei der nächsten Variable - gespart ist also gar nichts. Ich bin zwar auch eine Bitfuchserin, aber irgendwo hört's auf.
An der Geschwindigkeit dürfte sich bei einem modernen Prozessor auch nichts ändern. Der Bus ist (meist) eh 32 Bits breit und es macht zeitlich keinen Unterschied, ob du nun auf ein Byte oder eine int zugreifst.
-
SonjaB schrieb:
und es macht zeitlich keinen Unterschied, ob du nun auf ein Byte oder eine int zugreifst.
doch. byte-zugriffe können langsamer sein
-
also es würde schon einen unterschied machen, weil der buffer so um die 4 mb groß sein MUSS.
aber da net gesagt hat, dass man die int eigentlich nur zur überprüfung braucht, frage ich mich, ob man für den buffer selbst dann trotzdem char's nehmen kann ^^
-
Natürlich kannst du chars für den Puffer nehmen.
-
Ringding schrieb:
Natürlich kannst du chars für den Puffer nehmen.
du musst chars nehmen sonst kannst du keine strings (char*) aus dem buffer lesen ohne zeichenweise zu kopieren.
K.
-
guck mal:
#include <stddef.h> #include <stdlib.h> #include <stdio.h> bool liesdatei( const char* name, char* puffer, size_t maximalGroesse ) { FILE* fp; /* Zeiger auf Dateisteuerblock */ int c; /* Puffer fuer einzelnes Zeichen */ size_t ix; /* Index in "puffer"-Speicher */ fp = fopen( name, "rb" ); if ( fp == 0 ) { fprintf( stderr, "Datei \"%s\" konnte nicht geoeffnet werden.\n", name ); return false; } while ( ( c = getc( fp ) != EOF ) { if ( ix >= maximalGroesse ) { fprintf( stderr, "liesdatei(): Datei \"%s\" ist groesser als %lu Bytes.\n", name, (unsigned long) maximalGroesse ); fclose( fp ); return false; } puffer[ ix++ ] = (char) c; } fclose( fp ); return true; } /* ... */ int main( int argc, char** argv ) { char* puffer; size_t groesse = (size_t)( 4UL * 1024UL * 1024UL ); puffer = (char*) malloc( groesse ); if ( puffer == 0 ) { fprintf( stderr, "nicht genug Speicher, um %lu Bytes zu allozieren", (unsigned long) groesse ); return 0; } if ( !liesdatei( "meinedatei", puffer, groesse ) ) { fprintf( stderr, "datei \"meinedatei\" konnte nicht gelesen werden\n" ); free( puffer ); return 0; } /* ... */ free( puffer ); return 0; }
hoffe, das hilft.
-
p.s.: in "liesdatei()" noch vor der while-Schleife "ix = 0U" einfuegen.
-
jupp, habs jetzt hinbekommen und auch verstanden
vielen dank an alle!
-
Bei mir kommt da noch ein Fehler beim Ausführen des Programms.
Meistens bekomm ich den Fehler in der Zeile:
bool liesdatei(const char* name, char* puffer, size_t maximalGroesse)
-
cHillb3rT schrieb:
Bei mir kommt da noch ein Fehler beim Ausführen des Programms.
Meistens bekomm ich den Fehler in der Zeile:
bool liesdatei(const char* name, char* puffer, size_t maximalGroesse)
Interesanter Fehler; Er sagt soviel aus...