我有代码,使用fstream操作二进制文件与二进制标志设置和使用未格式化的I/O函数读取和写入。这在我使用过的所有系统上都能正常工作(文件中的位与预期完全相同),但这些基本上都是美国英语。我一直想知道这些字节在不同的系统上被codecvt修改的可能性。使用C++编写二进制文件:默认语言环境很重要吗?
听起来像标准所说的,使用无格式I/O的行为与使用sputc/sgetc将字符放入streambuf中的行为相同。这些会导致streambuf中的溢出或下溢函数被调用,并且听起来像这些会导致经历一些codecvt(例如,参见C++标准中的27.8.1.4.3)。对于basic_filebuf,这个codecvt的创建在27.8.1.1.5中指定。这使得它看起来像结果将取决于basic_filebuf.getloc()返回的内容。
所以,我的问题是,我可以假设在一个系统上使用ofstream.write写出的字符数组可以在另一个系统上使用ifstream.read逐字恢复,无论任何人可能使用哪种语言环境配置系统?我会做如下假设:
- 程序正在使用默认 区域(即程序不 更改区域设置本身 在所有)。
- 系统都有CHAR_BIT 8,在每个字节内具有相同的位顺序,将文件存储为八位位组等。
- 流对象具有设置的二进制标志。
- 在这个阶段,我们不需要担心任何永久性差异。如果数组中的任何字节将被解释为多字节值,则将在稍后的阶段根据需要处理字节顺序转换。
如果默认语言环境不能保证在某些系统配置(我不知道,阿拉伯语或其他)上未经修改就通过这个东西,那么使用C++编写二进制文件的最佳方式是什么?
我认为你应该添加相同的字节顺序到你的假设。还是我完全在那里? – 2009-12-02 08:20:19
@TheScottMachine:Space_C0wb0y是正确的,将相同的字节顺序添加到您的假设 – Stan 2009-12-02 23:51:19
谢谢,我添加了一个额外的假设来澄清。 – TheScottMachine 2009-12-03 02:22:49