gpt4 book ai didi

c++ - 无法输出到 C++ 中的二进制文件

转载 作者:行者123 更新时间:2023-11-28 05:10:42 25 4
gpt4 key购买 nike

在我正在阅读的书中,它开始谈论二进制文件,以及我们如何像输出到文本文件一样输出到二进制文件。所以我开始阅读更多,想尝试一下;但是,我遇到了一个看似简单的问题,但考虑到我对二进制文件缺乏了解,我没有正确理解这个问题。

假设我创建了一个结构和一个函数。像下面这样。

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));

还尝试重新解释 cast。我还做了以下

file.write(actors.name, sizeof(actors.name));

它在没有错误的意义上工作,但它会以文本形式 (ASCII) 输出到文件。

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

最佳答案

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

file.write(reinterpret_cast<char *>(&actors), sizeof(actors));

but it would output to file in text form (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 , 从前一个值“华盛顿”的末尾遗留下来。

关于c++ - 无法输出到 C++ 中的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com