I'm looking for a simple method to read a hex value from a text file using streams. I searched Stack Overflow using "C++ hex read stream 0x" and most of responses were about writing hex as text or reading in hex values without the "0x" prefix. This question is about reading the hex number, with "0x" prefix as a number in one operation.
My method:
unsigned char byte;
std::istringstream sample("0xce");
sample >> std::hex >> byte;
Ends up with byte
containing '0' (0x30) from the first character.
The 'strtol` function handles the conversion, but requires reading the data, converting to C-style string.
I'm overloading the operator>>
in a class to read a comma separated value (CSV) text file. Here is a sample of the data file:
1,-4.93994892,0xa5,8,115.313e+3,
2,-4.93986238,0xc0,8,114.711e+3,
3,-4.93977554,0xc2,8,114.677e+3,
My extraction method:
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;
}
Do I need to use std::setw
?
Edit 1:
I'm using Visual Studio 2010 Premium on Windows 7, 64-bit platform.
The prefix 0x is used in code to indicate that the number is being written in hex. But what is 'B' doing in there? The hexadecimal format has a base of 16, which means that each digit can represent up to 16 different values.
A solution is to read the value using an unsigned int
then convert to unsigned char
:
unsigned int value;
inp >> hex >> value;
unsigned char byte;
byte = value & 0xFF;
I guess there is something about the type unsigned char
that is causing the issue.
Any C++ language lawyers can quote a section that describes this behavior?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With