3

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

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

4

1 回答 1

4

很大程度上取决于语言环境,但通常,磁盘上的文件不会使用与 ; 使用的相同编码形式(甚至相同的编码)wchar_tfilebuf执行实际读写的哪个根据其灌输的语言环境转换编码。并且不同编码或编码形式的字符串长度之间只有一种模糊的关系。(并且系统看到的大小与您可以从文件中读取的字节数不直接对应。)

要查看是否所有内容都已写入,请检查关闭f 的状态,即:

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

可能出错的一件事是外部编码没有字符之一的表示。如果您在"C"语言环境中,则基本执行字符集之外的任何字符都可能发生这种情况。

如果上面没有错误,则没有理由假设并非所有字符串都已写入。如果您尝试在另一个程序中读取它会发生什么?你得到相同数量的字符吗?

对于其余部分,nul 字符与 ; 中的任何其他字符一样std::wstring。它们没有什么特别之处,包括当它们被输出到流时。18446744073709551615 看起来非常像我 std::wstring::npos在 64 位机器上所期望的值。

编辑:

跟进 Mat Petersson 的评论:实际上,文件最终的字节数少于std::wstring. (std::wstring::size() 返回代码点的数量。)我考虑的是字节,而不是std::wstring::size()返回的内容。所以最有可能的解释是你的字符串中有一些字符在目标编码中无法表示(默认情况下,它可能只支持代码点为 32-126 的字符,外加一些控制字符)。

于 2013-08-14T10:00:36.657 回答