2015-11-18 2 views
1

Lorsque j'utilise std::istringstream pour lire des valeurs de pixels grises dans un fichier (0-255), je remarque un comportement étrange et je ne comprends pas ce qui se passe.C++ Lecture des ints en tant que caractères non signés en utilisant istringstream

Pour conserver la mémoire, je souhaite lire ces valeurs dans des caractères non signés (puisqu'ils ont la même plage 0-255). Cependant, il semble y avoir une sorte de moulage/troncature en cours.

fichier d'entrée:

194 
194 
155 
155 
124 
194 

Voici mon code:

getline(fp, line); 
unsigned char temp; 
istringstream iss(line); 
iss >> temp; 

Lorsque la valeur dans le fichier est 194, par exemple, la valeur entière temp est 49 ...

Quel type de casting est en cours?

+0

Vous pouvez utiliser une entrée non formatée: 'std :: istream :: get' pour des octets. –

+0

La question n'est pas de corriger le code, c'est quel type de casting/troncature se produit? – user2600959

+1

Veuillez être plus clair quant à vos données d'entrée. Pour le moment nous ne pouvons que _guess_ à son format, car "lire des valeurs à partir d'un fichier" ne nous dit effectivement rien! Ma conjecture est des nombres délimités par des espaces dans la gamme 0 <= x <= 255 en décimal lisible par l'homme via ASCII. –

Répondre

3

Il n'y a pas de conversion, ce comportement est dû à une surcharge.

std::basic_istream::operator>> arrive à être surchargé pour char types, extraire un seul caractère à la fois - 1, la valeur ASCII qui est 49. C'est le comportement que vous voulez, lorsque vous lisez des caractères uniques et que vous le supposez, que vous voulez exactement cela, lorsque vous extrayez un type de caractère.

Pour lire le texte sous forme de nombres délimités par des espaces, vous devez utiliser un type plus grand pour l'extraction, par ex. unsigned short ou std::uint16_t, puis diffusée en unsigned char.

+0

Merci! C'est la réponse que je cherchais! – user2600959

+2

Vous pouvez aussi bien vérifier si la valeur est dans la plage de 'unsigned char' avant la distribution. – LogicStuff

+0

La conversion en 'unsigned char' est bien définie, donc pas besoin de faire de vérification, sauf si vous voulez avoir une gestion spéciale pour les valeurs inattendues. –