basic_$fstream
-
hallo
ist nun ziemlich eine anfängerfrage. auf einer 8bit/byte-maschine steht z.b. in einer datei ein byte (1111 1111). soviel ich weiss kennt c++ das zweierkomplement nicht (im sinne von, dass es nicht spezifiziert ist ob das zweierkomplement verwendet wird oder nicht). nun möchte ich dieses eine byte auslesen (vorzugsweise als unsigned char denn 8x 1 ist für mich 255 und nicht -1), da ich das vorzeichen bei char nicht gebrauchen kann. das ganze soll natürlich plattformunabhängig sein. also eine datei die mein programm auf plattform 1 einliest soll auf plattform 2 gleich eingelesen werden. wäre es nicht der intuitive weg hier auf basic_ifstream<unsigned char> zuzugreifen? und wenn ja, muss ich dann meine eigene char-trait-klasse schreiben extra dafür? soviel ich weiss sind dieses unsigned <-> signed-konversionen ausserhalb des wertbereichs nur implementation-defined.
wie löst ihr sowas bzw. wie würdet ihr sowas lösen?
gruss
-
Du kannst problemlos mit einem
std::ifstreamunsigned charlesen. Das erfordert natürlich einenreinterpret_cast<char *>.
-
std::ifstream file("blubb.dat"); unsigned char c; file.read(static_cast<void*>(&c), 1); if (file.gcount() != 1) // fk this shit
-
einen char in einen unsigned char zu static-/reinterpret-casten ist welldefined und nicht plattformabhängig?
edit: ich meinte - wie gesagt - dass das lediglich implementation-defined ist, mehr aber nicht.
-
asfdlol schrieb:
einen char in einen unsigned char zu static-/reinterpret-casten ist welldefined und nicht plattformabhängig?
edit: ich meinte - wie gesagt - dass das lediglich implementation-defined ist, mehr aber nicht.
Da der
ifstreammit den Bytes nicht rechnet, sondern sie nur kopiert, ist das Casten sicher.PS: Die meisten C++-Programme machen viel absurdere Annahmen über plattformabhängiges Verhalten, zum Beispiel über das Layout von Typen größer als 1.