Re: unsigned statt signed chars aus Datei lesen
David Haller <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Message-ID | <[email protected]> |
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<char*>(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<unsigned char,
>std::char_traits<unsigned char> >::sentry::sentry[in-charge]
>(std::basic_istream<unsigned char, std::char_traits<unsigned char> >&,
>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<int_type>(EOF); }
====
Und:
====
/// 21.1.3.2 char_traits specializations
template<>
struct char_traits<wchar_t>
{
/* ... */
static int_type
eof() { return static_cast<int_type>(WEOF); }
====
Ergo muesste eigentlich:
====
template<>
struct char_traits<unsigned char>
{
/* ... */
static int_type
eof() { return static_cast<int_type>(EOF); }
====
die Loesung sein. Beachte aber, dass eof() einen int_type zurueckliefert!
Casten musst du aber IMO so oder so, das meiste wir der Compiler aber
eh wegoptimieren.
-dnh
--
Wenn du beim Autofahren ein "komisches Geraeusch" hoerst und stehenbleibst
(ohne das Geraeusch naeher identifizieren zu koennen!), dann schraubst du
ja auch nicht einfach mal auf Verdacht an der Nockenwelle rum, wenn's doch
nur am leeren Tank liegen koennte! [David Haller in suse-linux]
--
Um die Liste abzubestellen, schicken Sie eine Mail an:
[email protected]
Um eine Liste aller verfÃŒgbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]