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

标签 c++ binaryfiles

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

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

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/

相关文章:

database - 评估 HDF5 : What limitations/features does HDF5 provide for modelling data?

c++ - 为什么允许通过 const 引用而不是通过普通引用传递 R 值?

c++ - 确定与 COM RPC 服务器通信的客户端进程的进程 ID

c++ - 通过套接字发送二进制文件

c - 二进制文件中的结构体数组

c - 以十六进制打印 : program adds additional 0xFFs

c - 在二进制文件中存储二维数组的最省时的方法

c++ - Windows 10 上 std::sleep_for 的不可预测行为

c++ - throw() (即 __declspec(nothrow)) 是否在 Visual C++ 中提供了真正的好处?

c++ - Xcode:找不到 glib.h 文件