我有一个std::wstring
其大小为 139,580,199 个字符。
为了调试,我使用以下代码将其打印到文件中:
std::wofstream f(L"C:\\some file.txt");
f << buffer;
f.close();
之后注意到字符串的末尾丢失了。创建的文件大小为 109,592,584 字节(“磁盘上的大小”为 109,596,672 字节)。
还检查缓冲区是否包含空字符,执行以下操作:
size_t pos = buffer.find(L'\0');
期望结果是std::wstring::npos
但它是18446744073709551615
,但我的字符串末尾没有空字符,所以可能没问题。
有人可以解释一下,为什么我没有将所有字符串打印到文件中?
很大程度上取决于区域设置,但通常情况下,磁盘上的文件将
不使用与以下相同的编码形式(甚至相同的编码)
所使用的wchar_t
; the filebuf
这实际上是
阅读和写作根据其编码翻译
充满现场感。并且之间只有模糊的关系
不同编码或编码形式下字符串的长度。
(系统看到的大小并不直接对应于
您可以从文件中读取的字节数。)
要查看是否所有内容均已写入,请检查以下状态f
after关闭,即:
f.close();
if ( !f ) {
// Something went wrong...
}
可能出错的一件事是外部编码
没有某个角色的代表。如果
你在"C"
区域设置,任何字符都可能发生这种情况
基本执行字符集之外。
如果没有上述错误,就没有理由立即假设
并非所有字符串都已写入。如果发生什么情况
你尝试在另一个程序中读取它?你得到同样的吗
字符数与否?
对于其余的,nul 字符与其他字符一样
Astd::wstring
;他们没有什么特别的,包括
当它们输出到流时。还有18446744073709551615
看起来非常像我期望的价值std::wstring::npos
在 64 位机器上。
EDIT:
跟进 Mat Petersson 的评论:这实际上非常重要
文件最终的字节数不太可能少于实际字节数
中的代码点std::wstring
. (std::wstring::size()
返回代码点的数量。)我在考虑
字节,而不是指什么std::wstring::size()
返回。所以
最可能的解释是你有一些字符
您的字符串在目标编码中无法表示
(可能只支持带有代码点的字符
32-126,加上一些控制字符,默认情况下)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)