Unerwartetes Stream-Verhalten bei Typ (unsigned char)?!



  • Und eine andere Möglichkeit, ausser einer Template-Spezialisierung und einem cast nach int gibt es nicht?



  • Welches Problem hast Du denn mit der Template-Spezialisierung? Das wäre im Prinzip die einfachste Möglichkeit. Ein Flag für die IOstreams, die das trotzdem als Zahl und nicht als Zeichen lesen, gibt es afaik nicht.



  • Wenn ich eine Template-Spezialisierung benutze, bekomme ich beim Linken eine "multiple definition" Fehlermeldung. Angeblich sei die Methode für <unsigned char> in zwei .o Dateien definiert, welche kollidieren.

    Compiler ist GCC 3.3.6.



  • 7H3 N4C3R schrieb:

    Ein Char ist per se ein Zeichen, keine Zahl.

    Wenn du dir mal ne char_traits Klasse ansiehst wirst du feststellen dass ein char beides ist/sein kann.

    Ansonsten würde ich mal mein Glück mit nem istream_iterator probieren.

    MfG Spacelord



  • wenn du nur zahlentypen einlesen willst, dann kannst du es ja so machen:

    while( file.good() ) 
    { 
      string row; 
      T val; // T ist ein Template-Parameter 
    
      getline( file, row ); 
      istringstream stream( row ); 
    
      while( stream.good() ) 
      { 
        double num;
    
        stream >> num; 
        val=static_cast<T>(num);
    
        // irgendwas mit val anstellen... 
      } 
    }
    


  • Spacelord schrieb:

    Wenn du dir mal ne char_traits Klasse ansiehst wirst du feststellen dass ein char beides ist/sein kann.

    Wie Du im Standard unter 27.6.1.2.2 sehen kannst, gibt es aber keinen Arithmetic Extractor für char.

    Man könnte mal versuchen, das num_get<> Template selbst zu benutzen... probier ich mal aus. Falls es klappt, poste ich den Code.

    Edit:
    Hm zumindest im ersten Versuch mit nem halbwegs aktuellen GCC gibt's keine Version von num_get für char.

    Edit2:
    Und der Standard sieht auch keine Methode in num_get vor, um chars als Zahlen zu lesen. Also wäre Spezialiserung immernoch die beste Möglichkeit.

    @caffeine:
    Naja die Verwendung einer Template-Spezialisierung sollte aber nicht zu multiple definitions führen. Zeig mal den Code, der das macht.



  • Könnte man hier nicht vielleicht von num_get ableiten und es um char, unsigend char, signed char entsprechend erweitern? Oder ein eigenes facet schreiben?

    Hume? 😃



  • facet geht immer. Ist aber von kosten-nutzen Faktor relativ weit unten anzusiedeln.

    //edit was schreib ich da: das geht nicht! der op>> sucht sich nämlich gleich das "passende" facet aus, und das wird bei char nie num_get sein.



  • Natürlich dann nicht mehr op>> benutzen, sondern direkt das facet.



  • 7H3 N4C3R schrieb:

    Natürlich dann nicht mehr op>> benutzen, sondern direkt das facet.

    dann ist der kosten-nutzen faktor nahe null 😉

    kann ich gleich nach int casten und dann wieder nach char zurück 😃


Anmelden zum Antworten