使用 std::wofstream 输出 wchar_t 的 WEOF 会导致 .close() 失败

Outputing WEOF of wchar_t with std::wofstream causes .close() failure

提问人:Shadow Stalker 提问时间:10/19/2023 更新时间:10/19/2023 访问量:30

问:

我正在尝试实现一个简单的文本编辑器,并遇到了这个问题。 当使用 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 作为结束信号来避免这个问题,但我想知道问题背后的机制是什么,以及是否有办法在不涉及棘手方法的情况下解决它。

C++ fstream wchar-t wofstream

评论

0赞 Toby Speight 10/19/2023
截断可能会生成对编码无效的代码点。WEOFwchar_t
1赞 Alan Birtles 10/19/2023
WEOF根据定义,这不是一个有效的字符,所以这个错误并不奇怪?
0赞 Shadow Stalker 10/20/2023
明白了。似乎将 EOF 存储在正常字符中也是一种作弊,但大多数时候都可以正常工作。感谢您的回答。

答: 暂无答案