在我阅读的书中,它开始讨论二进制文件,以及我们如何输出到二进制文件,类似于我们如何输出到文本文件。所以我开始阅读更多,并想尝试一下;然而,我遇到了一个看起来像一个简单问题的问题,但考虑到我对二进制文件缺乏了解,我并没有理解。
所以我想说我创建了一个结构和一个函数。如下所示。
struct celebrities
{
char name[15];
char lastName[15];
};
void BinaryCreation(celebrities );
int main()
{
celebrities actors = { "Denzel", "Washington" };
BinaryCreation( actors);
system("pause");
}
现在,我将创建一个二进制文件:
void BinaryCreation(celebrities actors)
{
fstream file;
file.open("binaryfile.txt", ios::binary | ios::out);
现在,在书中它说明我应该写下面的东西把它输出成二进制文件:
file.write(address, size)
如果我有一个结构,我怎么会这样做会让人感到困惑?我尝试了以下方法:
file.write(&actors.name, sizeof(actors.name));
file.write(&name, sizeof(name));
也试过重新解释演员。 我也做了以下
file.write(actors.name, sizeof(actors.name));
在没有错误的意义上工作,但它会以文本形式(ASCII)输出到文件。
我确信这很简单,我忽略了一些东西,但此刻我无法弄明白。
答案 0 :(得分:1)
编写对象的原始内存内容的正确方法是:
file.write(reinterpret_cast<char *>(&actors), sizeof(actors));
但它会以文本形式(ASCII)输出到文件。
好吧,你的结构只包含文字,所以你打开它时会看到文字。
另外我猜你没有在十六进制编辑器中打开文件。如果这样做,您将看到每个字段占用15个字节,无论每个字符数组中包含的文本是否占用较少的空间。字段之间的额外填充字节可能不会在您用于查看文件内容的程序中表示为可打印字符。
例如,鉴于此计划:
#include <iostream>
struct celebrities
{
char name[15];
char lastName[15];
};
int main() {
celebrities actors = { "Denzel", "Washington" };
std::cout.write(reinterpret_cast<char *>(&actors), sizeof(actors));
return 0;
}
编译它并将程序的输出汇总到xxd
得到以下结果:
0000000: 4465 6e7a 656c 0000 0000 0000 0000 0057 Denzel.........W
0000010: 6173 6869 6e67 746f 6e00 0000 0000 ashington.....
每个字段恰好占用15个字节。空字符串终止符后面的未使用空格是附加的空字符(字节0)。如果您之前已经存储了一个较长的字符串,那么您可能会在输出文件中看到它的残留。
如果我们#include <cstring>
并将此行直接添加到上述程序中对std::cout.write()
的调用之上:
std::strcpy(actors.lastName, "Whitaker");
现在运行程序会生成以下内容:
0000000: 4465 6e7a 656c 0000 0000 0000 0000 0057 Denzel.........W
0000010: 6869 7461 6b65 7200 6e00 0000 0000 hitaker.n.....
请注意上一个值“华盛顿”结尾留下的唯一n
。