C ++二进制文件 - 写入int - 奇怪的行为

时间:2017-12-07 18:39:12

标签: c++ vector binary-data

我有一个简单的整数向量,我想把它写成二进制文件。例如:

#include <fstream>
#include <vector>

int main () {
    std::vector<uint32_t> myVector{5, 10, 15, 20 };
    // write vector to bin file
    std::ofstream outfile("./binary_ints.data",  std::ios_base::binary|std::ios::trunc);
    std::copy(myVector.begin(), myVector.end(), std::ostreambuf_iterator<char>(outfile));
    outfile.close(); 
    return 0;
}

然后,如果我检查文件&#34; binary_ints.data&#34;在十六进制模式下,我有这个:

00000000: 050a 0f14 0a

多好啊!

但是,如果myVector有这个数据:

std::vector<uint32_t> myVector{3231748228};

然后,存储的十六进制很奇怪:

00000000: 840a

84 in Hex与Int 3231748228不匹配。

这里发生了什么? 感谢。

1 个答案:

答案 0 :(得分:3)

问题是std::vector<uint32_t>调用期间char中的每个值都被解释为std::copy ()3231748228以十六进制表示为‭C0A09084std::copy ()获取uint32_t值,将其截断为Little-endian处理器上0x84的单字节。在文件字节0x84中写入字节0x0a后,添加了new line character

可能的解决方案是使用ofstream::write()代替std::copy ()

#include <fstream>
#include <vector>

int main () {
    std::vector<uint32_t> myVector{3231748228 };
    // write vector to bin file
    std::ofstream outfile("./binary_ints.data",  std::ios_base::binary|std::ios::trunc);

    outfile.write (
        (char*)(myVector.data ()), 
        myVector.size () * sizeof (decltype (myVector)::value_type));

    outfile.close();
    return 0;
}

请注意decltype ()的使用。只需编写sizeof (uint32_t)即可获得相同的效果,但使用decltype ()即使您更改了myVector值类型,也可以确保代码仍然正确。