使用reinterpret_cast<>以二进制方式写入文件

问题描述 投票:0回答:1
Foo program[] {...};

ofstream ofs{file_path, std::ios::binary};

if (ofs) {
   ofs.write(reinterpret_cast<char*>(program), sizeof(program));
   ofs.close();
}

我见过使用

reinterpret_cast<char*>
写入这样的文件的示例。这是不好的用法吗?

据我所知,结果指针不能保证位于相同的内存地址,但由于我们没有使用结果指针,它仍然是不好的风格吗?

c++ binary
1个回答
0
投票

据我所知,结果指针不能保证位于相同的内存地址

指针保证与

program
的地址表示相同的地址,并且保证指向
program

虽然目前存在一些技术问题,意味着通过此指针进行的“访问”尚未明确定义,但这在实践中没有相关性。该行为与实践中的预期完全一致: ofs.write(reinterpret_cast<char*>(program), sizeof(program));

会将 
program

的对象表示写入流中。

这个问题不是未定义的行为或类似的问题,而是语义:将对象的对象表示写入文件通常是一个坏主意,因为当您尝试读回它时,只有当系统/读回它的程序使用完全相同的类型表示(例如字节顺序)和完全相同的类布局(例如可以依赖于 ABI)。

通过为每个值定义固定的独立于系统的文件格式和表示形式,然后根据该协议写入每个

(而不是对象表示),将对象正确序列化到文件中几乎总是一种更安全的方法进入文件。

© www.soinside.com 2019 - 2024. All rights reserved.