【发布时间】:2011-10-18 11:36:23
【问题描述】:
我正在寻找一种使用流从文本文件中读取十六进制值的简单方法。我使用“C++ hex read stream 0x”搜索了 Stack Overflow,大多数回复都是关于将 hex 作为文本写入或读取没有“0x”前缀的 hex 值。这个问题是关于读取十六进制数字,在一次操作中使用“0x”前缀作为数字。
我的方法:
unsigned char byte;
std::istringstream sample("0xce");
sample >> std::hex >> byte;
以 byte 结尾,从第一个字符开始包含 '0' (0x30)。
'strtol' 函数处理转换,但需要读取数据,转换为 C 风格的字符串。
我在一个类中重载operator>> 以读取逗号分隔值 (CSV) 文本文件。以下是数据文件的示例:
1,-4.93994892,0xa5,8,115.313e+3,
2,-4.93986238,0xc0,8,114.711e+3,
3,-4.93977554,0xc2,8,114.677e+3,
我的提取方法:
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;
}
我需要使用std::setw吗?
编辑 1:
我在 Windows 7 64 位平台上使用 Visual Studio 2010 Premium。
【问题讨论】:
-
您可以省去自己解析 cvs 文件的麻烦,并使用足够灵活的现成解析器生成器来处理所有情况(包括 unicode):tinyurl.com/3zs2o6k
-
@Gene Bushuyev:感谢您的建议。我一直认为解析器对于简单的 CSV 文件来说太过分了。如果涉及语言或复杂协议,我会使用解析器。这个程序是一个小型分析器,我认为解析器会使程序过于复杂。