为什么std::wofstream不将所有wstring打印到文件中
why std::wofstream do not print all wstring into file?
我有一个std::wstring
,其大小为139580199个字符。
为了调试,我把它打印到文件中,代码是:
std::wofstream f(L"C:\some file.txt");
f << buffer;
f.close();
之后注意到字符串的末尾不见了。创建的文件大小为109592584字节("磁盘大小"为109596672字节)。
还检查了缓冲区是否包含空字符,这样做了吗:
size_t pos = buffer.find(L' ');
预期结果是std::wstring::npos
,但它是18446744073709551615
,但我的字符串末尾没有空字符,所以可能没问题。
有人能解释一下,为什么我没有把所有的字符串都打印到文件中?
很大程度上取决于区域设置,但通常情况下,磁盘上的文件会不使用与CCD_ 4使用的;filebuf
阅读和写作根据其翻译编码充满活力的场所。两者之间只有一种模糊的关系不同编码或编码形式的字符串的长度。(系统看到的大小与可以从文件中读取的字节数。)
要查看是否已写入所有内容,请检查f
的状态结束后,即:
f.close();
if ( !f ) {
// Something went wrong...
}
有一件事可能会出错,那就是外部编码没有其中一个字符的表示形式。如果如果您在"C"
区域设置中,任何字符都可能发生这种情况在基本执行字符集之外。
如果上面没有错误,就没有理由立即假设并不是所有的字符串都已写入。如果你试图在另一个程序中阅读它?你也一样吗字符数?
对于其他字符,nul字符与中的其他字符一样CCD_ 8;它们没有什么特别之处,包括当它们被输出到流时。和18446744073709551615看起来很像我期望的价值64位机器上的std::wstring::npos
。
编辑:
跟进Mat Petersson的评论:这实际上是高度文件的字节数不太可能少于CCD_ 10中的代码点。(std::wstring::size()
返回代码点数。)我在想字节,而不是根据std::wstring::size()
返回的内容。所以最有可能的解释是你在不能在目标编码中表示的字符串(可能只支持带有代码点的字符32-126,加上一些控制字符,默认情况下)。
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- Ctypes wstring通过引用传递
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 在一定长度后从数组中打印时缺少整数
- boost库的哪一部分使cout能够打印wstring以及如何打印?
- 打印出一个 std::vector<std::wstring>
- 为什么std::wofstream不将所有wstring打印到文件中
- 无法从char三元指针获取或打印wstring元素