2017-04-23 114 views
0

在我正在阅读的书中,它开始讨论二进制文件,以及如何输出到二进制文件,类似于我们如何输出到文本文件。所以我开始阅读更多,并想尝试一下;然而,我遇到了一个看似简单的问题,但考虑到我对二进制文件缺乏理解,我并没有正确理解它。在C++中输出为二进制文件时遇到困难

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

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)文件。

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

+1

将输出类型更改为二进制不会奇迹般地将您的文本更改为其他内容。它仍然是文本,仍然会被写为相同的值。区别在于二进制输出可以包含不是文本的字符(如NULL,或0x01或0x02)。 –

+0

@KenWhite我明白了,这就是把我抛弃的原因,我期待着一堆符号,而是得到了相同的文字。感谢您的意见。 – ReMaKe

回答

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,左从以前的价值结束时,“华盛顿”。

+0

是的,第二个代码工作。我一直认为二进制实际上是符号和数字,基本上就是你输出的方式。我将下载一个十六进制编辑器来检查它。 – ReMaKe

+0

@ReMaKe技术上二进制文件(实际上所有文件)都没有固有含义;需要对他们的内容进行解释,以便他们有用。以ASCII格式存储在内存中的数据以ASCII格式写出(除非它首先被编码为其他内容),所以你在输出文件中得到的是每个数组中存储的内容 - 这是ASCII。所以这个文件看起来像文本,因为,那就是存储在它里面的东西!请注意,“我的输出”是程序的输出*通过一个十六进制转储工具*,它显示每个字节的十六进制代码。 – cdhowie

+0

我明白了。我确信这本书会在接下来的几页,章节中解释它,但是我是否有任何直接的理由要输出到二进制文件,而不是常规的输出文件? – ReMaKe