C++ 从二进制文件读取16位整数时识别文件结尾

C++ 从二进制文件读取16位整数时识别文件结尾,c++,C++,我在识别代码中的EOF时遇到一些问题。文件table.bin包含表示16位整数的字节对。它们被分成由两个0x0字节分隔的组 代码正确读取文件中的所有数据,然后以某种方式将{0xF00D,{}}键/值对插入表中,这表明它读取的数据超过了它应该读取的数据。如何在此处正确检查EOF UChar是std::uint16\u t的类型定义 std::map<UChar, std::vector<UChar>> table; std::vector<UChar> v; s

我在识别代码中的EOF时遇到一些问题。文件
table.bin
包含表示16位整数的字节对。它们被分成由两个0x0字节分隔的组

代码正确读取文件中的所有数据,然后以某种方式将
{0xF00D,{}}
键/值对插入表中,这表明它读取的数据超过了它应该读取的数据。如何在此处正确检查EOF

UChar
std::uint16\u t的类型定义

std::map<UChar, std::vector<UChar>> table;
std::vector<UChar> v;
std::ifstream ifs("table.bin", std::ios::binary);
UChar n;
while (ifs.read(reinterpret_cast<char*>(&n), sizeof n))
{
    if (n != 0x0)
        v.push_back(n);
    else
    {
        table.insert(std::make_pair(v.front(), v));
        v.clear();
    }       
}
std::map表;
std::向量v;
std::ifstream ifs(“table.bin”,std::ios::binary);
乌查尔n;
while(如果读取(重新解释铸件(&n),尺寸n))
{
如果(n!=0x0)
v、 推回(n);
其他的
{
表.插入(std::make_pair(v.front(),v));
v、 清除();
}       
}

进一步检查代码,问题似乎不是如何检查EOF。即使在流的末尾有虚假数据,您也不会读取这些数据,除非它们是
sizeof n
的倍数


如果找到两个
0
值,会发生什么情况?您的第二个
v.front()
会导致未定义的行为(您在前一个0中清除了v),这是关于您在
映射中发现无关数据的唯一想法。因此,请检查您的数据,并向我们更新相关信息。

表中的条目数是否大于文件中的字节数/2?我使用一个9字节的文件进行了测试,成功地读取了4个短路,当下一个短路无法读取时,循环按预期结束。@RetiredInja否。该文件包含偶数个字节,最后一个字节对是
00
,因此如果读取为
std::uint16\u t
,则为0x0。然后,代码读取不在文件中的数据,然后才终止。听起来您可能需要在调试器中对其进行跟踪以查看发生了什么。一旦读取失败,循环应立即结束。
UChar
a>=16位类型吗?@retiredInja不,它实际上是std::uint16\t的类型定义,但最初是32位类型。道歉,如果这是一个困惑。我现在已经澄清了代码(仍然产生相同的结果,所以这不是问题所在)。代码看起来很好,我怀疑数据有问题。
read
返回流,如果流不好,则循环应该结束。无需显式检查
eof
,只需知道读取失败即可。正确。我想我当时还没有很好地理解OP的问题。我稍后再查,谢谢。