2

我是编程的初学者,我有一个问题。我想将结构写入我的二进制文件。我不确定结果。这是结构:

struct clientData
{
    unsigned int id;
    char name[25];
    char post[15];
    char degree[10];

    clientData(unsigned int, char*, char*, char*);
};

如您所见,我的结构包含一些字符字符串。这是主要问题: 我的字符串是否应该在最终的二进制文件中重新转换(因此它们对于记事本等应用程序不可读)? 因为我的结果看起来像这样(我无法添加图像,所以我将其粘贴):

Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ

这就是我写入二进制文件的方式:

ofstream binary_1st("binary_input.dat", ios::out | ios::binary);
...
binary_1st.write((char*) &cl, sizeof(clientData));
...
binary_1st.close();
4

3 回答 3

0

您正在按原样向文件写入结构,没有任何序列化或打包。所以结构将按原样编写,字符串将是可读的(如果它们在代码中是可读的),数字将是数字等。

顺便说一句,这个 M 在

Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ

意味着结构中的字符数组在向它们写入字符串之前不会归零,因此末尾没有尾随零,因此将在末尾写入“thrash”。

于 2013-05-13T16:40:25.363 回答
0

我的字符串是否应该在最终的二进制文件中重新转换(这样它们对于记事本等应用程序不可读)?因为我的结果看起来像这样(我无法添加图像,所以我将其粘贴):

不要担心这个。您的字符串可能不包含换行符。任何将二进制转换为文本格式的代码都应该担心记事本和 c。

您可能不应该发明自己的二进制格式。但是,如果您真的必须这样做,请注意以下事项。

  • 确保它包含版本信息。
  • 清楚数据大小,可能用int固定的 32 位或 64 位大小的东西替换它。
  • 逐字节存储整数,使其具有固定的字节序。请参阅http://linux.die.net/man/3/htons
  • 使用固定字符串编码。UTF-8。
  • 确保你知道你的字符串是如何终止的。要么在它们前面加上一个大小,要么在字符串之后写出一个 NUL 字节(你的示例代码都没有)。

更新:我刚刚注意到我的答案对于初学者来说可能不是很清楚,但我不想把它写成一篇文章。要点是逐字存储结构可能不是一个好主意。如果您需要有关其余部分的更多详细信息,请询问。

于 2013-05-13T16:40:45.180 回答
0

如果您希望它在记事本中可读,则需要将数据写入文本。使用<<运算符并重载它如何表示数据。

要将数据写入文本:

std::ostream& operator<<(std::ostream& os, const clientData& obj)
{
  os << obj.id << " " << obj.name << " " << obj.post << " " << obj.degree;
  return os;
}

...

binary_1st << cl << std::endl;

否则你有数据+一些不可读的编码数据。char []如果存储的字符串的长度小于数组的大小,即使您会在文件中看到垃圾。

于 2013-05-13T16:41:11.730 回答