IF流运算符>> uint16_t设置故障位

ifstream operator >> uint16_t sets failbit

本文关键字:gt 设置 故障 IF uint16 运算符      更新时间:2023-10-16

我正在尝试使用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位的变量?

从istreams中读取uint16_toperator>>过载是一个格式化的输入函数,意思是不读取二进制数据,它读取字符串,并在必要时将其转换为数字(例如使用strtoul或类似的)。

如http://en.cppreference.com/w/cpp/io/basic_istream

所述

类模板basic_istream提供对字符流的高级输入操作的支持。支持的操作包括格式化输入(例如整数值或空格分隔的字符和字符串)和非格式化输入(例如原始字符和字符数组)。

inFile >> temp16尝试读取(通常)ASCII数字序列,直到第一个非数字字符,然后将该数字序列转换为数字,如果它适合uint16_t,则将其存储在temp16中。如果从二进制文件中读取,则istream可能找不到ASCII数字序列,因此读取失败。

您需要使用未格式化的输入函数直接从文件中读取16位,而不需要尝试将字符串解释为数字,例如:

inFile.read(reinterpret_cast<char*>(&temp16), 2);

从具有>>的流中提取整数期望找到ascii数字。如果没有找到,则设置失败状态。

如果您的uint16_t数据不是由两个字节组成的纯粹巧合,其中第一个字节似乎在0x30和0x39之间,那么它注定要失败。如果它成功了,它也不会是你所期望的价值。

对于二进制数据使用:

    inFile.read (&temp16, sizeof(temp16)); 

,当然,用ios::binary模式打开文件。