提问人:Shadow Stalker 提问时间:10/19/2023 更新时间:10/19/2023 访问量:30
使用 std::wofstream 输出 wchar_t 的 WEOF 会导致 .close() 失败
Outputing WEOF of wchar_t with std::wofstream causes .close() failure
问:
我正在尝试实现一个简单的文本编辑器,并遇到了这个问题。 当使用 std::wofstream 将缓冲区保存到文件时,我在缓冲区的末尾保留了一个 WEOF,以方便程序中的其他部分。
这适用于普通 char(1 byte),但是当涉及到 wchar_t时,wosftream::close() 会抛出异常,如下所示: what(): basic_filebuf::_M_convert_to_external conversion error: iostream error
经过某些测试,我确信是WEOF导致了问题,以下代码可以重现它:
#include <fstream>
int main() {
std::wofstream fout("test.out");
std::wstring text = std::wstring(L"abc") + wchar_t(WEOF);
fout << text;
fout.close();
return 0;
}
在 'fout.close()' 处将引发异常。 通过删除“+ wchar_t(WEOF)”,一切正常。
请注意,fout.is_open() 保持,即文件已成功打开。
环境:WSL:gcc 版本 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) --std=c++17
它看起来与这里提到的错误非常相似,后者在 GNU 上被标记为已解决的已修复错误。
当然,我可以用“\0”代替 WEOF 作为结束信号来避免这个问题,但我想知道问题背后的机制是什么,以及是否有办法在不涉及棘手方法的情况下解决它。
答: 暂无答案
评论
WEOF
wchar_t
WEOF
根据定义,这不是一个有效的字符,所以这个错误并不奇怪?