C ++ liest unsigniertes Zeichen aus dem Datenstrom

10

Ich möchte vorzeichenlose Bytes aus einer Binärdatei lesen. Also habe ich den folgenden Code geschrieben.

%Vor%

Dies führt dazu, dass immer in 0 Bytes gelesen wird, wie durch die gezählte Variable angezeigt wird.

Es scheint im Internet Referenzen zu geben, dass ich das Gebietsschema einstellen muss, damit dies funktioniert. Wie genau das gemacht wird, ist mir nicht klar.

Derselbe Code funktioniert mit dem Datentyp 'char' anstelle von 'unsigned char'

Der obige Code unter Verwendung von unsigned Char scheint unter Windows zu funktionieren, scheitert aber in einem colinux Fedora 2.6.22.18.

Was muss ich tun, damit es für Linux funktioniert?

    
David 02.03.2009, 23:00
quelle

3 Antworten

16

C ++ erfordert die Implementierung nur, um explizite Spezialisierungen für zwei Versionen von Charaktereigenschaften bereitzustellen:

%Vor%

Die Streams und Strings verwenden diese Eigenschaften, um eine Vielzahl von Dingen herauszufinden, wie den EOF-Wert, den Vergleich verschiedener Zeichen, das Erweitern eines Zeichens mit einem int und dergleichen.

Wenn Sie einen Stream wie

instanziieren %Vor%

Sie müssen sicherstellen, dass es eine entsprechende Merkmaleigenschaftenspezialisierung gibt, die der Stream verwenden kann und dass diese Spezialisierung nützliche Dinge tut. Darüber hinaus verwenden Streams Facetten zum Formatieren und Lesen von Zahlen. Ebenso müssen Sie Spezialisierungen von diesen auch manuell bereitstellen. Der Standard erfordert nicht einmal eine vollständige Definition der primären Vorlage für die Implementierung. Sie könnten also auch einen Kompilierungsfehler bekommen:

  

Fehler: Spezialisierung std :: char_traits konnte nicht instanziiert werden.

Ich würde stattdessen ifstream verwenden (was ein basic_ifstream<char> ist) und dann in eine vector<char> hineinlesen. Wenn Sie die Daten im Vektor interpretieren, können Sie sie später in unsigned char konvertieren.

    
Johannes Schaub - litb 02.03.2009, 23:31
quelle
13

Verwenden Sie nicht den basic_ifstream, da dies eine Spezialisierung erfordert.

Verwenden eines statischen Puffers:

%Vor%

mit einem Vektor:

%Vor%

Verwenden Sie Reserve, anstatt die Größe beim ersten Aufruf zu ändern:

%Vor%

Wie Sie sehen können, ist die Größe des Vektors ohne den Aufruf von .resize (counted) falsch. Bitte beachten Sie das. Es ist üblich, Casting zu verwenden, siehe cppReference

    
sfossen 02.03.2009 23:06
quelle
0

Ein viel einfacherer Weg:

%Vor%     
rlbond 03.03.2009 00:36
quelle

Tags und Links