在C 中输出到二进制文件中的麻烦

Trouble outputting into a binary file in c++

本文关键字:麻烦 二进制文件 输出      更新时间:2023-10-16

在我正在阅读的书中,它开始谈论二进制文件,以及我们如何输出到二进制文件的方式类似于我们如何输出到文本文件。因此,我开始阅读更多,并想尝试一下。但是,我已经遇到了一个简单的问题,但是考虑到我在二进制文件方面缺乏理解,我却没有正确理解的问题。

所以可以说我创建了一个结构和一个函数。如下。

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(提交。

我敢肯定这很简单,而且我正在忽略某些东西,但是目前我无法弄清楚。

编写对象的原始内存内容的正确方法是:

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,从上一个值的末尾剩下的"华盛顿"。