unsigned statt signed chars aus Datei lesen
Hallo, ich habe folgendes Problem mit C++. Statt chars würde ich lieber direkt unsigned chars aus einer Datei lesen (das spart dauerndes Casting). Hier sollte statt "char" "unsigned char" verwendet werden: char ch[3]; ifstream file(argv[1]); file.read(ch, 3); Wie geht das? Danke für alle Antworten. Grüße, Christian
Hi Christian! Christian Schneider schrieb am 08.05.2005 02:02 :
Hier sollte statt "char" "unsigned char" verwendet werden:
char ch[3]; ifstream file(argv[1]); file.read(ch, 3);
Wie geht das?
Etwa so (ungetestet):
unsigned char ch[3];
ifstream file(argv[1]);
file.read(reinterpret_cast
Hi! Am Sonntag, 8. Mai 2005 03:04 schrieb Michael Wenger:
Etwa so (ungetestet): unsigned char ch[3]; ifstream file(argv[1]); file.read(reinterpret_cast
(ch), 3);
Das ist nicht ganz das, was ich wollte. Damit muss bei jedem Lesevorgang
gecastet werden.
Ich habe noch folgende Zeile "gefunden" und versucht:
basic_ifstream<unsigned char> file(argv[1]);
Allerdings meint dann der Linker immer:
/tmp/
ccRbHBu6.o(.gnu.linkonce.t._ZNSt13basic_istreamIhSt11char_traitsIhEE6sentryC1ERS2_b
+0xa9): In function `std::basic_istream
Hi! Christian Schneider schrieb am 08.05.2005 15:08 :
Am Sonntag, 8. Mai 2005 03:04 schrieb Michael Wenger:
Etwa so (ungetestet): unsigned char ch[3]; ifstream file(argv[1]); file.read(reinterpret_cast
(ch), 3); Das ist nicht ganz das, was ich wollte. Damit muss bei jedem Lesevorgang gecastet werden.
Um einen Cast kommst du mWn nicht herum, da es von Compileroptionen abhängt, ob char als signed oder unsigned aufgefasst wird. Wenn du also explizit unsigned oder signed char haben willst, musst du casten. Das unterscheidet char von anderen primitiven Datentypen. Gruß, Michael
Hallo, Am Sun, 08 May 2005, Christian Schneider schrieb:
Am Sonntag, 8. Mai 2005 03:04 schrieb Michael Wenger:
Etwa so (ungetestet): unsigned char ch[3]; ifstream file(argv[1]); file.read(reinterpret_cast
(ch), 3); Das ist nicht ganz das, was ich wollte. Damit muss bei jedem Lesevorgang gecastet werden.
Ich habe noch folgende Zeile "gefunden" und versucht: basic_ifstream<unsigned char> file(argv[1]);
Allerdings meint dann der Linker immer: /tmp/ ccRbHBu6.o(.gnu.linkonce.t._ZNSt13basic_istreamIhSt11char_traitsIhEE6sentryC1ERS2_b +0xa9): In function `std::basic_istream
::sentry::sentry[in-charge] (std::basic_istream &, bool)': : undefined reference to `std::char_traits<unsigned char>::eof()' [...] Wieso geht "basic_ifstream<char>" (= "ifstream"), aber "basic_ifstream<unsigned char>" nicht?
Das sagt dir dein Linker doch:
std::char_traits<unsigned char>::eof()
ist nicht definiert. Vgl. bits/char_traits.h:
====
/// 21.1.3.1 char_traits specializations
template<>
struct char_traits<char>
{
/* ... */
static int_type
eof() { return static_cast
Am Dienstag, 10. Mai 2005 02:04 schrieb Philipp Thomas:
Weil Ersteres in der C++ Standard-Bibliothek implementiert ist, Letzteres aber nicht.
Danke (auch an David und Michael). Ich hatte die Meldungen nicht ganz verstanden und gedacht, dass es woanders ran läge. Momentan kämpfe ich noch etwas mit C++. ;-) Grüße, Christian
participants (4)
-
Christian Schneider
-
David Haller
-
Michael Wenger
-
Philipp Thomas