gpt4 book ai didi

c++ - 是否定义了 ofstream 实现的默认模式?

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:27 24 4
gpt4 key购买 nike

给定以下代码:

std::ofstream stream("somefile");

if (!stream)
{
return 1;
}

当调用 .write(....) 并使用 stdc++libc++ 时,流处于二进制模式(std::ios::binary).

然而,当使用 MSVC (2015/2017RC1) 时,它似乎处于文本模式或一些奇怪的东西,因为生成的文件比实际写入的文件大。

但如果我显式设置模式 std::ios::binary MSVC 的行为类似于前面提到的其他标准库的 std::ofstream 实现。


示例代码:

#include <vector>
#include <cstdio>
#include <fstream>

std::size_t fsz(const char* filename) {
std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
return static_cast<std::size_t>(in.tellg());
}

int main() {
std::ofstream stream("filename");

if (!stream)
return 1;

std::vector<unsigned long long int> v = {0x6F1DA2C6AC0E0EA6, 0x42928C47B18C31A2, 0x95E20A7699DC156A, 0x19F9C94F27FFDBD0};

stream.write(reinterpret_cast<const char*>(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

差异会变得更大,这取决于写入的数据量和数据的内容。

最后我的问题还是一样,是undefined还是unspecified behavior?


将上面的 vector 更改为以下内容可以使示例更清楚地说明发生了什么。

std::vector<unsigned long long int> v = {0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A};

最佳答案

流构造器使用的默认模式是ios_base::out。由于没有明确的 text 模式标志,这意味着流以文本模式打开。文本模式仅对 Windows 系统有影响,它将 \n 字符转换为 CR/LF 对。在 POSIX 系统上它没有效果,文本和二进制模式在这些系统上是同义词。

关于c++ - 是否定义了 ofstream 实现的默认模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42412759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com