所以我有以下功能:
template < typename T >
void SomeClass::ReadBinary(T& Res)
{
size_t sBytesToRead = sizeof(T);
Res = 0;
std::vector<char> vcBuffer(sBytesToRead);
m_Fstream.read(&vcBuffer[0], sBytesToRead);
// tbd - use reintepert_cast
Res = reinterpret_cast<T>(&vcBuffer[0]);
}
其中m_Fstream
为std::fstream
。
此功能按预期工作。但是,当我将m_Fstream
更改为键入std::wfstream
并稍微调整一下这个功能时:
template < typename T >
void SomeClass::ReadBinary(T& Res)
{
size_t sBytesToRead = sizeof(T);
Res = 0;
std::vector<wchar_t> vcBuffer(sBytesToRead); // type of vector changed
m_Fstream.read(&vcBuffer[0], sBytesToRead);
// tbd - use reintepert_cast
Res = reinterpret_cast<T>(&vcBuffer[0]);
}
我得到不同的结果(意味着Res
的不同的int值)。我有点希望在这里有问题。在这两种情况下,从文件中读取字节的可能性很大。
我有点失落,不知道如何解决这个问题。任何想法?
T
可以是:uint8_t
,uint16_t
&amp; uint32_t
答案 0 :(得分:1)
如果要从流中读取二进制值,则需要:
template < typename T >
void SomeClass::ReadBinary(T& Res)
{
m_Fstream.read(&Res, sizeof(Res));
}
没有必要分配任何东西的向量,也不需要重新解释任何东西。
这仅适用于std::fstream
。不要将std::wfstream
用于二进制输入,仅使用std::fstream
。 sizeof(T)
可能是奇数,但sizeof(wchar_t)
可能是偶数,因此您无法使用wfstream
读取所需的确切字节数。如果您绝对必须使用std::wfstream
,并且您绝对相信sizeof(T)
除以sizeof(wchar_t)
,您可以尝试类似
m_Fstream.read(&Res, sizeof(Res)/sizeof(decltype(m_Fstream)::char_type));
但我个人从未尝试过这个。