给定以下代码:
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
差异可能会更大,这取决于写入的数据量和数据的内容。
最后我的问题还是一样,是未定义的还是未指定的行为?
将上述向量更改为以下向量会使示例更明显地了解正在发生的事情。
std::vector<unsigned long long int> v = {0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A, 0x0A0A0A0A0A0A0A0A};