Estoy buscando un método simple para leer un valor hexadecimal de un archivo de texto utilizando secuencias. Busqué Desbordamiento de pila usando "secuencia de lectura hexadecimal de C++ 0x" y la mayoría de las respuestas fueron sobre escribir hexadecimal como texto o leer en valores hexadecimales sin el prefijo "0x". Esta pregunta se trata de leer el número hexadecimal, con el prefijo "0x" como número en una operación.Lea el formato de texto hexadecimal 0x de la secuencia
Mi método:
unsigned char byte;
std::istringstream sample("0xce");
sample >> std::hex >> byte;
termina con byte
contenga '0' (0x30) desde el primer carácter.
La función 'strtol` maneja la conversión, pero requiere leer los datos, convirtiéndolos en cadenas de estilo C.
Estoy sobrecargando el operator>>
en una clase para leer un archivo de texto de valores separados por comas (CSV). Este es un ejemplo del archivo de datos:
1,-4.93994892,0xa5,8,115.313e+3,
2,-4.93986238,0xc0,8,114.711e+3,
3,-4.93977554,0xc2,8,114.677e+3,
Mi método de extracción:
class Csv_Entry
{
public:
friend std::istream& operator >>(std::istream& inp, Csv_Entry& ce);
unsigned int m_index;
double m_time;
unsigned char m_byte;
unsigned int m_data_length;
double m_bit_rate;
};
std::istream&
operator >> (std::istream& inp, Csv_Entry& ce)
{
char separator;
inp >> ce.m_index;
inp >> separator;
inp >> ce.m_time;
inp >> separator;
inp >> std::hex >> ce.m_byte;
inp >> separator;
inp >> ce.m_data_length;
inp >> separator;
inp >> ce.m_bit_rate;
inp.ignore(10000, '\n');
return inp;
}
¿Es necesario utilizar std::setw
?
Edición 1:
Estoy usando Visual Studio 2010 Premium en Windows 7, la plataforma de 64 bits.
Puede ahorrarse la molestia de analizar el archivo cvs usted mismo y usar un generador de analizador listo que sea lo suficientemente flexible como para manejar todos los casos (incluido unicode): http://tinyurl.com/3zs2o6k –
@Gene Bushuyev: Gracias por la sugerencia. Siempre he pensado que los analizadores sintácticos eran excesivos para archivos CSV simples. Usaría un analizador si hubiera un lenguaje involucrado, o un protocolo complejo. Este programa es un pequeño analizador y creo que un analizador haría que el programa sea demasiado complejo. –
Relacionado, vea [Conversión de cadena hexadecimal con "0x" inicial a corto firmado en C++?] (Http://stackoverflow.com/q/1487440/608639) – jww