我有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
,但我的字符串最后没有空字符,所以可能没问题。
有人可以解释一下,为什么我没有将所有字符串打印到文件中?
答案 0 :(得分:4)
很大程度上取决于区域设置,但通常磁盘上的文件会
不要使用相同的编码形式(甚至相同的编码)
wchar_t
使用的;实际的filebuf
阅读和写作根据其翻译编码
充满感染的地方。而且之间只有一种模糊的关系
不同编码或编码形式的字符串长度。
(并且系统看到的大小不直接对应于
你可以从文件中读取的字节数。)
要查看是否所有内容都已写入,请检查f
的状态
在结束后,即:
f.close();
if ( !f ) {
// Something went wrong...
}
可能出错的一件事是外部编码
没有其中一个字符的表示。如果
你在"C"
语言环境中,任何角色都可能出现这种情况
在基本执行字符集之外。
如果上面没有错误,就没有理由拒绝承担 并非所有字符串都已写入。如果发生什么 你试着在另一个程序中阅读它吗?你得到了同样的 是否有字符数?
对于其余的,空字符是与其他字符一样的字符
一个std::wstring
;他们没什么特别的,包括
当它们输出到流时。和18446744073709551615
看起来非常像我期望的价值
64位计算机上的std::wstring::npos
。
跟随Mat Petersson的评论:它实际上非常高
不太可能的文件结尾的字节数比那里少
std::wstring
中的代码点。 (std::wstring::size()
返回代码点的数量。)我在思考
字节,而不是std::wstring::size()
返回的内容。所以
最有可能的探索是你有一些角色
您的字符串在目标编码中无法表示
(可能只支持带代码点的字符
32-126,默认加上几个控制字符。)