我有一个简单的整数向量,我想把它写成二进制文件。例如:
#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不匹配。
这里发生了什么?
感谢。
答案 0 :(得分:3)
问题是std::vector<uint32_t>
调用期间char
中的每个值都被解释为std::copy ()
。 3231748228
以十六进制表示为C0A09084
。 std::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
值类型,也可以确保代码仍然正确。