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

时间:2013-08-14 08:30:24

标签: c++ ofstream wstring wofstream

我有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,但我的字符串最后没有空字符,所以可能没问题。

有人可以解释一下,为什么我没有将所有字符串打印到文件中?

1 个答案:

答案 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,默认加上几个控制字符。)