vector <char> to int vs. vector <wchar_t> to int </wchar_t> </char>

时间:2014-10-14 12:08:51

标签: c++ type-conversion fstream

所以我有以下功能:

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_Fstreamstd::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_tuint16_t&amp; uint32_t

1 个答案:

答案 0 :(得分:1)

如果要从流中读取二进制值,则需要:

template < typename T >
void SomeClass::ReadBinary(T& Res)
{
    m_Fstream.read(&Res, sizeof(Res));
}

没有必要分配任何东西的向量,也不需要重新解释任何东西。

这仅适用于std::fstream。不要将std::wfstream用于二进制输入,仅使用std::fstreamsizeof(T)可能是奇数,但sizeof(wchar_t)可能是偶数,因此您无法使用wfstream读取所需的确切字节数。如果您绝对必须使用std::wfstream,并且您绝对相信sizeof(T)除以sizeof(wchar_t),您可以尝试类似

的内容
    m_Fstream.read(&Res, sizeof(Res)/sizeof(decltype(m_Fstream)::char_type));

但我个人从未尝试过这个。