读取整数的二进制文件

时间:2018-06-10 14:28:00

标签: c++ binary ifstream

首先,我将一些int变量写入.bin文件。然后我试着读回那些数字,但我没有那样做。

这就是我的写作方式:

std::ofstream OutFile;
OutFile.open("encode.bin", std::ios::out | std::ios::binary);

for(int i = 0; i < all.size(); i++){
        int code = codes[i];
        OutFile.write(reinterpret_cast<const char *>(&code), sizeof(int));
}
OutFile.close();

这就是我编写数字时我的.bin文件的样子:65, 66, 66, 257, 258, 260

  Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   
00000000: 41 00 00 00 42 00 00 00 42 00 00 00 01 01 00 00   
00000010: 02 01 00 00 04 01 00 00         

endian有问题吗?我看到数字是相反的。

我是怎么看的:

std::vector<int> allCodes;
std::ifstream inputD(file, std::ios::binary);

std::vector<char> buffer((
    std::istreambuf_iterator<char>(inputD)),
    (std::istreambuf_iterator<char>()));

for (auto a : buffer) {
    data.push_back(static_cast<int>(a));
    allCodes.push_back(a);
};

当我显示向量时,前三个数字(65, 66, 66)被正确读取,其间的零数很少。

这是显示器的外观:

1 个答案:

答案 0 :(得分:1)

首先,你不应该在这里使用.menu { height:60px; background-color:#272F38; } .menu label { display:inline; font-family: "Lato Bold"; font-size:16px; color:#767676; font-weight: bold; cursor: pointer; width:100%; } .menu input { position: absolute; left: -9999px; } .menu ul { display:none } #toggle:checked ~ .menu ul { display:block; font-size:20px; font-family:"Lato Bold"; font-weight: bold; color:black; } ,因为字节顺序 - 你失去了可移植性。在您的情况下,您可以写出 4字节长的整数。然后,您尝试将数字读取为 char ,其中只有 1个字节。这就解释了为什么你看到前三个数字的正确输出(它们在0到255之间)以及为什么它们之间有一些零。

在这里,我在硬盘上找到了一些代码,它可能写得更好,但是它可以完成工作并且比你的解决方案更安全。

reinterpret_cast

使用示例:

template<typename T> void ReadInteger(T &Output, const char* Buffer)
{
    static_assert(std::numeric_limits<T>::is_integer, "return type cannot be non-arithmetic or floating point");
    Output = 0;
    for(unsigned int i = 0; i<sizeof(T); i++)
    {
        Output <<= 8;
        Output |= Buffer[i];
    }
}

template<typename T> void WriteInteger(T Value, char* Buffer)
{
    static_assert(std::numeric_limits<T>::is_integer, "first parameter cannot be non-arithmetic or floating point");
    for(unsigned int i = 0; i<sizeof(T); i++)
    {
        Buffer[sizeof(T)-i-1] = static_cast<char>(Value&0xff);
        Value >>= 8;
    }
}