在C 中输出到二进制文件中的麻烦
Trouble outputting into a binary file in 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(提交。
我敢肯定这很简单,而且我正在忽略某些东西,但是目前我无法弄清楚。
编写对象的原始内存内容的正确方法是:
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
,从上一个值的末尾剩下的"华盛顿"。
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 在C 中输出到二进制文件中的麻烦