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

标签 c++ vector binary-data

我有一个简单的整数 vector ,我想将它写入一个二进制文件。例如:

#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;
}

然后,如果我以十六进制模式检查文件“binary_ints.data”,我会得到:

00000000: 050a 0f14 0a

没关系!

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

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

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

00000000: 840a

Hex 中的 84 与 Int 3231748228 不匹配。

这里发生了什么? 谢谢。

最佳答案

问题是您的 std::vector<uint32_t> 中的每个值被解释为 char在你的std::copy ()期间调用。 3231748228以十六进制表示为 ‭C0A09084 . std::copy ()需要 uint32_t值,将其截断为单字节,即 0x84Little-endian处理器。写入字节后 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,您也可以确定代码仍然正确值类型。

关于C++ 二进制文件 - 写入整数 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47701665/

相关文章:

c++ - 根据 std::bitset<N> 增加 std::vector<T> 内的元素

php - 编译 php-cpp main.cpp 文件时出错

c++ - 在 "for"循环中初始化两个指向相同值的指针

c++ - vector 中的指针

c++ - 自定义数据 iostream

java - 如何检查文件是否为纯文本?

c++ - 在类的构造函数中初始化 ifstream 变量

c++ - 是否需要创建OpenGL情侣程序?

r - 从 r 中的向量生成列表

c++ - 如何使用具有用户定义结构的 C++ vector ?