Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

1

09.03.2013, 13:03

fstreams - position springt 5 bytes weiter, nachdem 4 bytes gelesen werden

Hallo,

Ich versuche, in C++ einen fileparser zu schreiben, der binärdateien chunkweise liest. Dies ist völlig schiefgelaufen, und beim debuggen habe ich mir die Positionen des filepointers genauer angesehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
long p1 = str.tellp();
if (command == 0x07) // dem_stop
    break;

int tick;
str.read((char*)&tick,4);
if (tick >= 0)TotalTicks = tick;
long p2 = str.tellp();
if((p2-p1)>4) cout << "Ich habe einfach mal entschieden, mehr als 4 bytes weiterzuspringen." << endl;


Und tatsächlich ist p2-p1 manchmal 5. Wie kommt das? Ich habe nicht einmal einen ansatz, das zu debuggen; Es passiert auch immer an der selben stelle in der datei.

C-/C++-Quelltext

1
str.seekp(p1-p2+4,ios::cur);
Hat das problem (teilweise) gelöst, jetzt springt er an einer anderen stelle ein byte weiter. Ich verstehe nur noch bahnhof; Was tun?

Ich habe auch schon recompiled, vs neu gestartet und meinen pc neu gestartet. Hat alles nichts gebracht. In einem anderen Fall, ist das programm nach endlich vielen schritten terminiert. Wenn ich allerdings str.tellp() aufgerufen habe, hat sich das programm in eine endlosschleife gefangen!? Ich kann gerne noch mehr code zeigen, aber der code oben ist 1:1 aus meinem code rauskopiert.

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

2

09.03.2013, 14:25

Vielleicht ist die Datei im Textmodus geöffnet, so dass einige Bytes schon vorinterpretiert sind und dadurch evtl. übersprungen werden.
Lieber dumm fragen, als dumm bleiben!

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

09.03.2013, 14:45

Probier es mal mit tellg() statt tellp(). Die Varianten der Funktionen mit g am Ende sind nämlich für den Input-Stream und passen eher zum Lesen.

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

4

09.03.2013, 15:57

@Tobiking, das macht keinen unterschied, da nur gelesen werden kann (ios_base::in)
@Jonathan_Klein: Danke! ich hatte eben nur ios_base::in, nicht ios_base::in|ios_base::binary. Ich wusste gar nicht, dass das einen echten Unterschied macht. Es funktioniert jetzt wie gewollt :)
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

09.03.2013, 17:52

Danke! ich hatte eben nur ios_base::in, nicht ios_base::in|ios_base::binary. Ich wusste gar nicht, dass das einen echten Unterschied macht.


Ist davon nicht auszugehen, wenn es schon beide Optionen gibt? ;)
@D13_Dreinig

CBenni::O

1x Contest-Sieger

  • »CBenni::O« ist der Autor dieses Themas

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

6

10.03.2013, 00:34

@David_pb, Ich hatte nie einen bemerkt. Daher hatte ich nicht daran gedacht, dass es einen untershied macht (außer einen syntaktischen, keinen semantischen).

Zitat von »MSDN«

binary, to read a file as a binary stream, rather than as a text stream.


Wo genau liegen da die Unterschiede zwischen einem Text- und einem Binärstream? Scheinbar werden "0x0A" und "0x0D" (\r und \n) bytes in \r\n umgewandelt? Das könnte auch der grund für den fehler im code darstellen; Was sonst noch?

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige