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

1

08.07.2015, 20:39

std::wistream holt nur einen char

Ich hab VS2010 am werkeln und hab festgestellt, dass std::wistream/std::wfstream, wenn ich deren get methode aufrufe, der dateizeiger nur um 1 weiterrückt, aber nicht wie erwartet um 2, da es sich ja um einen wchar_t handelt, welcher nunmal 2 bytes/chars groß ist. Ist da was was ich nicht weiß? :hmm:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.07.2015, 22:23

Was genau ist für dich der "Datenzeiger"?

3

09.07.2015, 06:39

Ich meinte Dateizeiger. Also den welchen man sich mit tellg besorgen kann. Und der rutscht nur um eine Position weiter, anstatt zwei. Und nun frag ich warum ^^

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

09.07.2015, 08:45

Mit tellg bekommst du keinen Zeiger, sondern eine Position. Und die Position ist unabhängig davon wie groß dein Zeichen ist.

5

09.07.2015, 09:33

Neineinein :D wenn ich von einem wistream mit get einen wchar_t hole, rückt der dateizeiger nur um eine position weiter. Somit holt das nächste get nicht den wchar_t danach sondern irgendeinen schnulli.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.07.2015, 10:51

Was heißt "das Nächste geht nicht"? Was genau kommt zurück? Vermutlich pos_type(-1)!? Ich nehme an, du hast den Stream im Textmodus geöffnet?

7

09.07.2015, 13:21

Also, noch mal von ganz vorne ^^
Ich öffne mit einem wfstream eine Unicode-Datei und lese die BOM aus. Funktioniert alles. Im Hexeditor sehe ich zuerst 2 bytes für die BOM und dannjeweils zwei bytes für die zeichen, welche also schön in ein wchar_t passen würden. Sagen wir mal es steht der text 'Baum' drin, dann würde es byteweise so aussehen:

Quellcode

1
'B', '\0', 'a', '\0', 'u, '\0', 'm', '\0',

So nun lese ich mit wfstream::get zeichen für zeichen ein:
(geöffnet im textmodus)

C-/C++-Quelltext

1
2
3
4
5
6
wchar_t c1 = file.get();
wchar_t c2 = file.get();
wchar_t c3 = file.get();
wchar_t c4 = file.get();
wchar_t c5 = file.get();
...


c1 enthält danach 'B', c2 '\0', c3 'a', c4 '\0', c5 'u', usw.
Also holt sich get nur jeweils ein byte/char anstatt, wie man es sich denken könnte, einen wchar_t. Dementsprechend wird auch der Dateizeiger nur um ein byte weitergerückt.
Ich kann da natürlich ein Workaround basteln, aber warum macht get das bloß? :hmm:

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

09.07.2015, 13:55

Also laut dem hier, musst du dem stream noch sagen, dass er UTF16 lesen soll (ich gehe von 16 aus, weil du von 2 Byte BOM sprichst)

9

09.07.2015, 15:20

Oh, sowas gibts 8o
Vielen dank!

Werbeanzeige