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]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.