fstream - Unterschied zwischen >> und *.get()
-
Halli Hallo
Ich hätte da mal eine kleine Frage.
Kann mir jemand den Unterschied in der Verwendung von:
a) dem überladenen Operator >>
und
b) der Methode get(); http://www.cplusplus.com/ref/iostream/istream/get.htmlAlso am besten noch ein Bsp:
a)
while([b]f_stream >> chTemp[/b] && iBytesToRead > 0) { std::cout << std::uppercase << std::hex << static_cast<int>(chTemp) << " "; iBytesToRead--; }b)
while([b]f_stream.get(chTemp)[/b] && iBytesToRead > 0) { std::cout << std::uppercase << std::hex << static_cast<int>(chTemp) << " "; iBytesToRead--; }bei a) gibts die Ausgabe: 89 50 4E 47 1A 0 0 0
und bei b) 89 50 4E D A 1A Awie kommt der Unterschied zustande? die Ausgabe von b) entspricht dem Inhalt der Datei!
-
Top se schrieb:
bei a) gibts die Ausgabe: 89 50 4E 47 1A 0 0 0
und bei b) 89 50 4E D A 1A Awie kommt der Unterschied zustande? die Ausgabe von b) entspricht dem Inhalt der Datei!
Bei a) liest Du formatiert ein und bei b) unformatiert, d.h. Byte für Byte, daher entspricht dies dem (binären) Inhalt der Datei.
Beim formatierten Einlesen werden sogenannte 'whitespace'-Zeichen überlesen, wenn das skipws-Flag gesetzt ist (Default beim std::istream). Zu den 'whitespace'-Zeichen gehören auch 0xD (CR) und 0xA (LF) was z.B. bei DOS-Text-Dateien das Zeilenende ist. Auch können beim formatierten Einlesen Konvertierungen je nach verwendeter locale durchgeführt werden.Das erklärt aber nicht die 0x47 ('G') im Fall a)

Gruß
Werner
-
danke, das war ne perfekte Erklärung, vielen Dank!
Das erklärt aber nicht die 0x47 ('G') im Fall a)
ähm, ja, das habsch bei b) vergessen, also ist das auch geklärt *gg*
Aber noch ne andere Frage, wie kann ich unsigned char mit fstream`s nutzen, z.B.:
image_stream.get(chTemp)wenn hier chTemp vom Typ unsigned char ist, dann gibts nen groben Fehler:
error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::get(_Elem &)' : cannot convert parameter 1 from 'unsigned char' to 'char &'
Ich muss folgendes machen (thx @codefinder *g*):
image_stream.get(reinterpret_cast<char &>(chTemp)aber das gefällt mir eigentl nciht so richtig, weil z.B. wenn ich Dateien lesen will, deren Bytes (im hexadezimalsystem) größer als 0x80 (>128 dec) sind, dann platzt der normale char und ich bekomme beim Auslesen Probleme, deshalb brauche ich unsigned chars, aber die immer so zu casten, ist nicht so prima *gg*.
Ähm, kann mir das einer von euch erklären, ich würde mich freuen!
-
Du kannst versuchen, deinen filestream mit unsigned char zu öffnen.
#include <fstream> #include <string> // für char_traits typedef basic_fstream<unsigned char, std::char_traits<unsigned char> > filestream;
-
Ein frohes neues Jahr wünsch ich euch allen!
@ .filmor
wenn ich diese Zeile (typedef ...) so wie sie dort steht bei mir in mein Projekt einfüge, dann bekomme ich diese beiden Fehlermeldungen:
...\c_png.h(16) : error C2143: syntax error : missing ';' before '<'
...\c_png.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-intIch verwende VC++ 2005 Express Ed.
Aber wenn es so gehen würde, wäre das priam, danke schonmal für den Tipp!
-
Da fehlt wohl ein "std::" am Anfang.
-
danke, die Antwort kam ja rasant und hat mir auch geholfen, dankeschön!