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.
A solution is to read the value using an
unsigned intthen convert tounsigned char:I guess there is something about the type
unsigned charthat is causing the issue.Any C++ language lawyers can quote a section that describes this behavior?