我是编程的初学者,我遇到了问题。 我想写一个结构到我的二进制文件。而且我不确定结果。这是结构:
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();
答案 0 :(得分:0)
您正在编写文件 as-is 的结构,没有任何序列化或打包。因此,结构将按原样编写,字符串将是可读的(如果它们在代码中可读),数字将是数字等。
顺便说一下,这个M在
Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ
表示结构中的字符数组在向它们写入字符串之前不会归零,因此末尾没有尾随零,因此最后会写入“thrash”。
答案 1 :(得分:0)
我的字符串应该在最终的二进制文件中重新转换(所以它们 像记事本等应用程序无法读取?因为我的结果看起来 那样的(我不能添加图片,所以我只是粘贴它):
不要担心这个。您的字符串可能不包含换行符。任何将二进制文件转换为文本格式的代码都应该担心Notepad& c。
您可能不应该发明自己的二进制格式。但如果你真的必须,那么请注意以下几点。
int
。更新:我刚刚注意到我的回答对于初学者来说可能不太清楚,但我不想把它变成一篇文章。重点是逐字存储结构可能不是一个好主意。如果您需要有关其余部分的更多详细信息,请询问。
答案 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 []
中的字符串的长度小于数组的大小,即使您在文件中也会看到垃圾。