Werte werden falschrum ausgegeben
-
Ich möchte mit getc() bzw. fgetc() Werte aus verschiedenen Dateien auslesen, dabei habe ich das Problem, dass die Werte falschrum ausgegeben werden wenn ich mehrere in einer Zeile ausgeben lasse, splitte ich die Ausgabe auf zwei Befehle auf ist es richtig herum. Woran liegt das?
Hier mal mein Code:
fseek(img, 0L, SEEK_SET); // img zeigt auf eine .gif Datei printf("gif1: %i %i\n", fgetc(img), fgetc(img)); fseek(img, 0L, SEEK_SET); printf("gif2: %i", fgetc(img)); printf(" %i\n", fgetc(img)); fseek(img, 0L, SEEK_SET); std::cout<<"gif3: " <<fgetc(img)<<" "<<fgetc(img)<<"\n"; fseek(img, 0L, SEEK_SET); std::cout<<"gif4: " <<fgetc(img)<<" "; std::cout<<fgetc(img)<<"\n";Als Ausgabe bekomme ich dann
gif1: 73 71
gif2: 71 73
gif3: 73 71
gif4: 71 73Hoffe ihr könnt mir helfen.

-
IIRC wird von rechts nach links aufgeloest, also erst das rechte und dann das linke fgetc() ausgefuehrt etc.
das ist C/C++ standard, also musst du deinen code umstellen
-
Wie das wird von rechts nach links aufgelöst?
bei
int c= 1; int d= 2; std::cout<<"test: " <<c<<" "<<d<<"\n"Gibt er doch auch 1 2 aus und nicht umgekehrt.

-
aufgeloest, nicht geprintet. aufgeloest heisst die funktion wird aufgerufen, der rueckgabewert wird eingesetzt. ersetze bei deinem beispiel c und d durch eine funktion die einen counter zurueckgibt, dann verstehst du was ich meine.
-
Das ist eigentlich compilerspezifisch...
Nur an sog. Sequenzpunkten (sequence points) muß die Reihenfolge eingehalten werden (und die Parameter bzw. die Kommas stellen keinen Sequencepunkt dar).
-
Kann man dem Compiler auch nicht irgendwie sagen in welcher Reihenfolge er das abarbeiten soll?
Ich arbeite jetzt vorerst mal mit dem zweizeiler, aber würde mich schon noch interessieren ob und wie man sowas steuern kann.
-
ich wuerde mal sagen dass, wenn man diese situation hat, das an schlechtem design liegt. also in gutem design sollte dieses problem nicht auftreten.
in diesem beispiel: dateiheader liesst man lieber mit fread ein statt mit fgetc.
wenn denn fgetc, dann mit einer schleife in einen buffer lesen.
-
loki1985 schrieb:
in diesem beispiel: dateiheader liesst man lieber mit fread ein statt mit fgetc.
Warum? Mit fread() muss ich doch vorher wissen wieviel ich einlesen möchte, mit fgetc() kann ich jedes Byte einzeln prüfen und mir die gesuchten rausfischen. Oder hab ich da was falsch verstanden?
-
naja, wenn du weisst dass du dir einen sagen wir mal 8 byte langen header einlesen willst, z.B. um zu pruefen ob es sich um ein valides PNG file handelt, dann kannst du das in einem fread() aufruf machen, und danach den buffer ueberpruefen. wenn der jetzt nicht genug lesen konnte, e.g. weil die datei leer ist, erkennst du das an der rueckgabe oder eben am buffer.
wenn du unbedingt mit fgetc() arbeiten willst OK, aber eben nicht zwei aufrufe direkt nacheinander als parameter verwenden, eher in buffer, oder tempvariablen speichern und diese dann als parameter verwenden.