2010-07-28 19 views
6

Tengo este código de ejemplo (incorrecto) para obtener un valor de stringstream y almacenarlo en una variable de tamaño byte (debe estar en una var de byte único, no en una int) :Obtener un valor de bytes utilizando stringstream

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    stringstream ss("1"); 

    unsigned char c; 
    ss >> c; 

    cout << (int) c << endl; 
} 

La salida cuando ejecuto esto es 49, que no es lo que me gustaría ver. Obviamente, esto se trata como un char y no como un simple valor numérico. ¿Cuál es la forma más C++ ish de que c tenga un 1 en lugar de un 49 cuando se convierte en un int?

Gracias!

+0

Tratar la cadena: "\ 01". O configure una matriz de caracteres e inicialice con {1, 0} –

Respuesta

10

La mayor parte de C++ - forma ish es, sin duda a de análisis el valor adecuadamente mediante la lectura en otro tipo integral, y continuación fundido a un tipo byte (ya que la lectura en un char nunca va a analizar - lo hará siempre acaba de leer el siguiente carácter):

typedef unsigned char byte_t; 

unsigned int value; 
ss >> value; 
if (value > numeric_limits<byte_t>::max()) { 
    // Error … 
} 

byte_t b = static_cast<byte_t>(value); 

he usado unsigned int ya que es el más natural, aunque unsigned short sería, por supuesto, también el trabajo.

+0

Gracias por la respuesta. Esperaba que hubiera alguna bandera de formateo, pero también funciona un elenco. – twk

2

Reste '0' de ella:

cout << (int) (c - '0') << endl; 

'0' tiene un valor de 48, por lo que, por tanto, 49 - 48 = 1

+0

Desafortunadamente, necesito el valor correcto almacenado en la var. – twk

3

un char siempre lo hará. Necesita leer un int (o flotación o doble, etc.) o de lo contrario se llamará al "formateador" incorrecto.

unsigned char c; 
unsigned int i; 
ss >> i; 
c = i; 
+0

Luego, después de leer el int, cópielo a un char! – Gianni

0
stringstream ss("1"); 
unsigned char c; 
{ 
    unsigned int i; 
    ss >> i; 
    c = i; 
} 
cout << static_cast<int>(c) << endl; 

Will work. También podrías hacer cosas inseguras con el puntero, pero yo simplemente iría con lo de arriba.

-1

Esto se debe a que las constantes de cadena en C++ se tratan como texto.
dos opciones:

  • codificar la cadena utilizando escaparon números: Números

    • Octal: \ 0 <d> {1,3}
    • números hexadecimales: \ 0x < d {> 2}

    std :: stringstream ("\ 01 \ 02 \ 03 \ 04 \ 0xFF");

  • o construir una matriz de char y inicializarlo utilizando números:

    datos char [] = {0, 1, 2,3, 4, 255};

¿Qué tal:

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    char x[] = {1,0}; 
    stringstream ss(x); 

    unsigned char c; 
    ss >> c; 

    cout << (int) c << endl; 
} 
Cuestiones relacionadas