IO流是否便携?

我想知道IO流是否真的是可移植的(我认为它们应该是可以肯定的)? 特别是在处理unix和windows中使用的文件时。

具体来说,如果我在Windows中将一个double值转储到文件中,然后使用iostreams从文件读取unix上相同的值,是否会因两个操作系统的字节序变化而引起问题?

格式化io怎么样? 我在某处读过,不知道在哪里,当操纵格式化数据时,windows和unix处理相同的方式存在一些差异。 任何人都可以请在这个问题上抛出一些光?


C ++标准是抽象的,并没有提到任何特定的操作系统(AFAIK)。 所以,iostream库是可移植的。 话虽如此,C ++标准允许某些实现细节,包括对用户可见的一些实现细节(而不仅仅隐藏在标准C ++库中)与实现相关。 这允许OS和/或编译器的提供者选择他们的首选方式来实现C ++标准。

任何依赖于依赖于实现的行为的代码显然都不是可移植的,即使在相同操作系统和/或编译器的不同版本中也是如此。 换句话说,应该避免这样的代码。

注意:有时需要编写与实现相关的代码。 在这种情况下,必须防止代码违反假定的依赖于实现的行为。 例如,程序可能会假定sizeof(long unsigned)==8 。 在这种情况下,至少一个static_assert(sizeof(long unsigned)==8,"long unsigned not 8 bytes")应该停止编译无效代码,但理想情况下应该存在一个替代版本并且通过模板魔法C风格的宏)。 C ++ 11标准实际上提供了保证sizeof(std::uint64_t)==8 (以及类似)的类型std::uint64_t来避免此类问题。 但是, sizeof(ostream)仍然依赖于实现。


它是可移植的,如果你从一个系统写入一个特定的字节序列,将该序列传输到另一个系统(通过文件或套接字,这并不重要),你可以读回相同的字节序列另一边。 如果你用文本模式而不是二进制模式来写或读,那么行结束符(我认为理论上其他实现定义的特殊字符)可能会被重新解释。

不可移植的是double的精确表示,即二进制或格式化的字节序列。 二进制例如因为字节序的,并格式化的,因为在运行时库细微的差别,可能意味着你的结果可能是一个ULP(或有时更多)相差一个系统中编码字符串时再换double另一个,即使你输出什么应该是足够的十进制数字的精度。 NaN值的字符串表示也留给实现。

就C ++标准而言, double不需要是IEEE双精度值。 因此理论上二进制表示之间可能没有任何共同之处,并且在表示哪些值的方面也存在很大差异,并因此在执行格式化I / O时输出/接受哪些字符串。 在实践中,IEEE通常被使用,并且字符串通常不会引入比您预期的浮点运算更多的错误。


文件输入输出:是的,他们是compatable。 Unix中的位流与Windows上的位流相同。 Unix中的双重值与Windows相同,都遵循标准。

格式化:我不知道任何二进制格式(以双精度为例),您可能正在谈论文本。 Windows中的文本格式与Unix不同,这是导致许多问题的原因。

二进制接口/代码可移植性:如果您正在使用IO功能,那么它是不可移植的。 std :: input / output流,即f / o / stream实现不是可移植的,它也不是可移植的。

链接地址: http://www.djcxy.com/p/68189.html

上一篇: Are IO streams portable

下一篇: JavaFx and playing HD movies under Ubuntu