gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:01:29 24 4
gpt4 key购买 nike

我有一个 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 使用的那个;执行实际操作的 filebuf阅读和写作根据其翻译编码充满活力的地方。之间只有模糊的关系不同编码或编码形式的字符串的长度。(而且系统看到的大小并不直接对应于您可以从文件中读取的字节数。)

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

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

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

如果上面没有错误,就没有理由假设并非所有字符串都已写入。如果会发生什么您尝试在另一个程序中阅读它?你有没有一样字符数与否?

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

编辑:

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

关于c++ - 为什么 std::wofstream 不将所有 wstring 打印到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18226745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com