我的代码使用带有二进制标志集的 fstream 并使用未格式化的 I/O 函数读取和写入来操作二进制文件。这在我曾经使用过的所有系统上都能正常工作(文件中的位与预期完全相同),但这些基本上都是美国英语。我一直想知道这些字节是否有可能被不同系统上的编解码器修改。
听起来标准说使用未格式化的 I/O 与使用 sputc/sgetc 将字符放入流缓冲区中的行为相同。这些将导致streambuf 中的溢出或下溢函数被调用,听起来这些会导致某些东西通过一些codecvt(例如,参见c++ 标准中的27.8.1.4.3)。对于 basic_filebuf,此编解码器的创建在 27.8.1.1.5 中指定。这使得结果看起来取决于 basic_filebuf.getloc() 返回的内容。
所以,我的问题是,我是否可以假设在一个系统上使用 ofstream.write 写出的字符数组可以在另一个系统上使用 ifstream.read 逐字恢复,无论任何人可能在他们的系统上使用什么语言环境配置?我会做出以下假设:
- 该程序正在使用默认区域设置(即,该程序根本没有更改区域设置本身)。
- 系统都具有 CHAR_BIT 8,每个字节内具有相同的位顺序,将文件存储为八位字节等。
- 流对象设置了二进制标志。
- 在这个阶段,我们不需要担心任何字节序差异。如果将数组中的任何字节解释为多字节值,则将在稍后阶段根据需要处理字节顺序转换。
如果默认语言环境不能保证在某些系统配置(我不知道,阿拉伯语或其他东西)上未经修改地通过这些东西,那么使用 C++ 编写二进制文件的最佳方法是什么?