为什么std::wofstream不将所有wstring打印到文件中

why std::wofstream do not print all wstring into file?

本文关键字:打印 wstring 文件 std wofstream 为什么      更新时间:2023-10-16

我有一个std::wstring,其大小为139580199个字符。

为了调试,我把它打印到文件中,代码是:

std::wofstream f(L"C:\some file.txt");
f << buffer;
f.close();

之后注意到字符串的末尾不见了。创建的文件大小为109592584字节("磁盘大小"为109596672字节)。

还检查了缓冲区是否包含空字符,这样做了吗:

size_t pos = buffer.find(L'');

预期结果是std::wstring::npos,但它是18446744073709551615,但我的字符串末尾没有空字符,所以可能没问题。

有人能解释一下,为什么我没有把所有的字符串都打印到文件中?

很大程度上取决于区域设置,但通常情况下,磁盘上的文件会不使用与CCD_ 4使用的;filebuf阅读和写作根据其翻译编码充满活力的场所。两者之间只有一种模糊的关系不同编码或编码形式的字符串的长度。(系统看到的大小与可以从文件中读取的字节数。)

要查看是否已写入所有内容,请检查f的状态结束后,即:

f.close();
if ( !f ) {
    //  Something went wrong...
}

有一件事可能会出错,那就是外部编码没有其中一个字符的表示形式。如果如果您在"C"区域设置中,任何字符都可能发生这种情况在基本执行字符集之外。

如果上面没有错误,就没有理由立即假设并不是所有的字符串都已写入。如果你试图在另一个程序中阅读它?你也一样吗字符数?

对于其他字符,nul字符与中的其他字符一样CCD_ 8;它们没有什么特别之处,包括当它们被输出到流时。和18446744073709551615看起来很像我期望的价值64位机器上的std::wstring::npos

编辑:

跟进Mat Petersson的评论:这实际上是高度文件的字节数不太可能少于CCD_ 10中的代码点。(std::wstring::size()返回代码点数。)我在想字节,而不是根据std::wstring::size()返回的内容。所以最有可能的解释是你在不能在目标编码中表示的字符串(可能只支持带有代码点的字符32-126,加上一些控制字符,默认情况下)。