ifstream operator >> uint16_t设置failbit

Tho*_*ten 1 c++ stl file

我正在尝试使用c ++ std::ifstream类将二进制文件准备到一组变量中.

以下示例有效:

std::ifstream inFile;
inFile.open("example.bin");
uint8_t temp8;
uint16_t temp16;
inFile >> temp8;
inFile >> temp8;
Run Code Online (Sandbox Code Playgroud)

但是,如果我用一行替换最后两行

inFile >> temp16;
Run Code Online (Sandbox Code Playgroud)

什么都没有读,inFile.fail()返回true.

任何人都可以解释,为什么我不能读入16位变量?

Jon*_*ely 5

从istreams operator>>读取的重载uint16_t是格式化的输入函数,意味着不读取二进制数据,它读取字符串并在必要时将其转换为数字(例如,使用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);
Run Code Online (Sandbox Code Playgroud)