c++ - 使用 reinterpreter_cast 读写二进制文件

标签 c++ file binary reinterpret-cast

例如,如果我有一个名为 Obj 的类和一个名为 obj1Obj。当我想用 reinterpret_cast 写入二进制文件时,我以二进制模式打开该文件,然后,

outstream.write( reinterpret_cast<const char *>(&obj1), sizeof(obj1) )

其中 outstream 是一个 ifstream。

当我想从那个文件中读取时,

instream.read( reinterpret_cast<char *>(&obj1), sizeof(obj1) )

发生了什么。它以二进制读取 obj1 的表示并转换为 obj1 或它是如何工作的。当我写的时候我明白它解释 obj1 一个字节但是当我读的时候我不明白发生了什么。

最佳答案

当您将指向对象的指针重新解释为指向char 的指针时,您将写入对象本身的内存表示。这包括

  • 对象内部的所有指针。对于具有虚拟成员的类,这可能包括指向 vtable 的指针,具体取决于实现
  • 成员之间的所有填充,
  • 所有数据成员,以您的硬件字节序排列。

此写入不包括指针指向的对象的任何部分。

而且,当你将一个带有指针的对象读回内存时,这些指针中的值将是垃圾。如果取消引用其中的任何一个,就会出现未定义的行为。

这使得该技术仅适用于普通旧数据 (POD) 对象,即原语和由原语和其他 POD 对象组成的结构/类。此外,当您需要跨硬件兼容性时,该技术不适用。

关于c++ - 使用 reinterpreter_cast 读写二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668167/

相关文章:

c# - 从 C# 应用程序调用 C++ 代码或移植它?

file - Golang 将自定义 os.File 添加到 os.Stdout

jquery - 模拟点击 &lt;input type =“file”/> jQuery、Opera

mysql - 将二进制 SHA1 哈希存储到 mySQL BINARY(20) 列中

c++ - libc++abi.dylib:以 std::length_error 类型的未捕获异常终止: vector

C++ 查找算法 : How do I find the last occurance of an element?

c++ - 堆栈运行时错误

python - OpenAI, Python, 删除文件

php - MySQL 中的 Where 子句使用 VARBINARY 列

perl - 如何在 Perl 中将二进制字符串转换为数字?