二进制文件应该如何?

时间:2013-05-13 16:32:38

标签: c++ binaryfiles

我是编程的初学者,我遇到了问题。 我想写一个结构到我的二进制文件。而且我不确定结果。这是结构:

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

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

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

  

MilesEdgecombeМММММММММdocentММММММММpew1МММММММ

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

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

3 个答案:

答案 0 :(得分:0)

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

顺便说一下,这个M在

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

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

答案 1 :(得分:0)

  

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

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

您可能不应该发明自己的二进制格式。但如果你真的必须,那么请注意以下几点。

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

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

答案 2 :(得分:0)

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

将数据写为文本:

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 []中的字符串的长度小于数组的大小,即使您在文件中也会看到垃圾。