我正在尝试使用c ++ std::ifstream
类将二进制文件准备到一组变量中。
以下示例有效:
std::ifstream inFile;
inFile.open("example.bin");
uint8_t temp8;
uint16_t temp16;
inFile >> temp8;
inFile >> temp8;
但如果我用一行代替最后两行
inFile >> temp16;
无法阅读,inFile.fail()
返回true
。
任何人都可以解释一下,为什么我无法读入16位变量?
答案 0 :(得分:5)
从istreams读取operator>>
的{{1}}重载是格式化的输入函数,意味着不读取二进制数据,它读取字符串并在必要时将其转换为数字(例如使用{{1或类似的)。
如http://en.cppreference.com/w/cpp/io/basic_istream
所述类模板
uint16_t
支持对字符流的高级输入操作。支持的操作包括格式化输入(例如整数值或空格分隔的字符和字符串)和未格式化的输入(例如原始字符和字符数组)。
strtoul
尝试读取一系列(通常)ASCII数字,直到第一个非数字字符,然后将该数字序列转换为数字,如果它适合basic_istream
个商店它在inFile >> temp16
。如果您正在读取二进制文件,则istream可能无法找到ASCII数字序列,因此读取失败。
您需要使用未格式化的输入函数直接从文件中读取16位而不尝试将字符串解释为数字,例如:
uint16_t
答案 1 :(得分:2)
从>>
的流中提取整数需要找到ascii数字。如果找不到,则设置失败状态。
如果你的uint16_t
数据不是由两个字节组成的纯巧合,第一个似乎是在0x30和0x39之间,那么它注定要失败。如果它会成功,那就不是你期望的价值。
对于二进制数据使用:
inFile.read (&temp16, sizeof(temp16));
当然,请使用ios::binary
模式打开文件。