在C++中向fstream写入二进制数据

14

问题

我有几个结构体,里面包含了一些来自于cstdint库的整数,例如uint64_t。有没有一种方法可以将它们写入二进制文件中而不需要手动将它们拆分成char数组并使用fstream.write()函数呢?

我的尝试

我最初的想法是,C++会自动识别我正在操作二进制文件,并且使用<<运算符将整数写入该二进制文件。所以我尝试了这个:

#include <iostream>
#include <fstream>
#include <cstdint>
 
using namespace std;
 
int main() {
  fstream file;
  uint64_t myuint = 0xFFFF;
  file.open("test.bin", ios::app | ios::binary);
  file << myuint;
  file.close();
  return 0;
}

不过,这将字符串“65535”写入文件。

我是否可以以某种方式告诉fstream切换到二进制模式,就像我可以使用<< std::hex更改显示格式一样?

如果上述所有内容失败,我需要一个函数,将任意的cstdint类型转换成char数组。

我并不是特别关心字节序,因为我会使用相同的程序来读取它们(在下一步中),所以它会被取消。


请参见例如此答案 - Jodocus
1个回答

16

可以的,这就是std::fstream::write的用途:

#include <iostream>
#include <fstream>
#include <cstdint>

int main() {
  std::fstream file;
  uint64_t myuint = 0xFFFF;
  file.open("test.bin", std::ios::app | std::ios::binary);
  file.write(reinterpret_cast<char*>(&myuint), sizeof(myuint)); // or with recent C++: reinterpret_cast<std::byte*>
}

这解决了我问题的一部分。我希望能够在我的自定义 fstream 中只使用 <<。我是否可以以某种方式重载所有(或一组)cstdint 类型的 <<?比如一个接受预定义类型列表的模板? - youR.Fate
是的,在其实现中使用 std::fstream 定义一个新类型,并使用模板化的 operator<< - YSC
是的,但我能告诉模板只接受例如uint64_t、uint16_t和uint8_t,而不接受例如std::string或bool吗? - youR.Fate
可以的。 - lmat - Reinstate Monica
为什么我应该将它复制到字符缓冲区中? - wowonline
@wowonline编辑掉了,那是一个错误。 - YSC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接