用 ofstream 写前导零

Writing preceding zeros with ofstream

我正在编写一个程序,该程序将逐字节读取和写入指示文件内容的文件格式。这个程序的本质是前两个字节详细说明文件的那部分还剩下多少字节,后面跟着另外两个字节表明文件的这一部分实际代表什么。文件的长度会重复此模式。这意味着我必须写出由前面的零缓冲的确切数字,以便每个组件都是它需要的确切大小。我写了一个虚拟文件来说明我的观点:

#include <fstream>
#include <stdint.h>

int main() {
  std::ofstream outputFile;
  outputFile.open("test.txt", 
          std::ios::out | std::ios::ate | std::ios::binary);
  const int16_t HEADER = 0x0002;
  int16_t recordSize = 2*sizeof(int16_t);
  int16_t version = 0x0258;
  outputFile << recordSize << HEADER << version;
  outputFile.close();
}

写入一个名为 "test.txt" 的文件,其十六进制内容为:

34 32 36 30 30

对于我们这些可以直接阅读十六进制的人来说,这意味着:

42600

如您所见,前面的零已被删除,我的记录不是我希望的那样。有没有一种方法可以使用 ofstream 来用零缓冲我的数字,就像我天真地尝试通过使用 int16_t 来处理我想要恰好两个字节长的所有写入一样?是否有另一种可能在风格上更正确的方式来做到这一点?

operator<< 用于文本格式化。您可能想改用 .write()。

例如

outputFile.write(reinterpret_cast<char*>(&recordSize), sizeof(int16_t));
outputFile.write(reinterpret_cast<char*>(&HEADER), sizeof(int16_t));
// ...