如何使用 fwrite 将带有填充的字符串写入二进制文件?

How to write a string with padding to binary file using fwrite?

我的要求是将“表示压力单位的 32 字节字符串”写入二进制文件。我要写的压力单位是 "Pa" 作为 32 字节的字符串。这是我的尝试。

#include <stdio.h>
#include <string>

using namespace std;

int main()
{
  FILE *myFile;
  myFile = fopen ("input_file.dat", "wb");
  //Units
  string units = "Pa";
  //Write Units
  fwrite (&units, 1, 32, myFile);
  fclose (myFile);
  return 0;
}

我期待(将 Pa 转换为 32 字节的二进制)。 “00100000”是空格。我如何将它们附加到 Pa?

01010000 01100001 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000

不过,我看到了

你不能直接把一个字符串写入文件,你是把stringclass的内容写入你的文件,这大概是指针和大小之类的东西,不是字符数据。

简单的解决方法是进行以下更改以写入字符数据(这包括空终止符,如果您不想删除 +1):

fwrite (units.c_str(), 1, units.size() + 1, myFile);

另一种方法是使用可以直接写入字符串的 c++ 流:

#include <fstream>
#include <string>

int main()
{
  std::ofstream myFile("input_file.dat", std::ios_base::binary);
  //Units
  string units = "Pa";
  //Write Units
  myFile << units;
  return 0;
}

字符串 "Pa" 只有 2 个字节(如果算上空终止符则为 3 个字节),但您想将 32 个字节写入文件。所以你需要用 30 space 个字符填充字符串。有许多不同的方法可以处理此问题:

char units[32] = "Pa";
memset(units+2, ' ', 30);
fwrite (units, 1, 32, myFile);
std::string units = "Pa";
std::string padding(32-units.size(), ' ');
fwrite (units.c_str(), 1, units.size(), myFile);
fwrite (padding.c_str(), 1, padding.size(), myFile);
std::string units = "Pa";
std::ostringstream oss;
oss << std::setw(32) << std::setfill(' ') << std::left << units;
std::string s = oss.str();
fwrite (s.c_str(), 1, s.size(), myFile);

也就是说,由于您使用的是 C++,因此您应该使用 C++ 样式文件 I/O 而不是 C 样式文件 I/O,例如:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;

int main() {
    ofstream myFile ("input_file.dat", ios::binary);
    string units = "Pa";
    myFile << setw(32) << setfill(' ') << left << units;
    return 0;
}