作者:推球了 | 来源:互联网 | 2023-02-10 21:52
给出以下代码:
std::ofstream stream("somefile");
if (!stream)
{
return 1;
}
调用.write(....)并使用stdc ++和libc ++时,流处于二进制模式(std::ios::binary
)。
但是,当使用MSVC (2015 / 2017RC1)时,它似乎处于文本模式或某种奇怪的状态,因为生成的文件大于实际写入的文件。
但是,如果我明确设置了模式,则std::ios::binary
MSVC的行为与std::ofstream
前面提到的其他标准库的实现类似。
示例代码:
#include
#include
#include
std::size_t fsz(const char* filename) {
std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
return static_cast(in.tellg());
}
int main() {
std::ofstream stream("filename");
if (!stream)
return 1;
std::vector v = {0x6F1DA2C6AC0E0EA6, 0x42928C47B18C31A2, 0x95E20A7699DC156A, 0x19F9C94F27FFDBD0};
stream.write(reinterpret_cast(v.data()),v.size() * sizeof(unsigned long long int));
stream.close();
printf("expect: %d\n", v.size() * sizeof(unsigned long long int));
printf("file size: %d\n", fsz("filename"));
return 0;
}
使用msvc运行时,上述代码的输出:
expect: 32
file size: 33
使用libc ++,stdc ++运行时,上述代码的输出:
expect: 32
file size: 32
差异可能会变得更大,这取决于写入的数据量和数据内容。
最后我的问题还是一样,是未定义还是未指定的行为?
将上面的向量更改为以下值可使该示例更清楚地了解正在发生的事情。
std::vector v = {0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A};
小智..
5
流构造函数使用的默认模式是ios_base::out
。由于没有显式text
模式标志,这意味着流以文本模式打开。文本模式仅在Windows系统上起作用,它将\n
字符转换为CR / LF对。在POSIX系统上,它无效,并且文本和二进制模式在这些系统上是同义词。
1> 小智..:
流构造函数使用的默认模式是ios_base::out
。由于没有显式text
模式标志,这意味着流以文本模式打开。文本模式仅在Windows系统上起作用,它将\n
字符转换为CR / LF对。在POSIX系统上,它无效,并且文本和二进制模式在这些系统上是同义词。