【问题标题】:Assigning a C file handle to C++ file stream将 C 文件句柄分配给 C++ 文件流
【发布时间】:2017-09-26 03:13:08
【问题描述】:

我可以用 C 函数 (fopen) 打开一个文件并将该句柄分配给 C++ 文件流 (fstream...) 吗?

询问原因:我想在 Windows 上处理 UTF8,但 fstream 类只有一个 const char* ctor/open 方法。所以我需要使用 C API 打开它,然后让一个流对象使用它。

甚至可以使用 boost 流库,因为它通常允许指定您自己的接收器/源,但我不知道从哪里开始。

澄清:我想打开一个路径为 UTF8 字符串的文件。所以文件打开方法必须支持fstream不支持的UTF8路径。接受 const wchar_t* 的 MSVC 扩展确实有帮助,但 MinGW 不提供这些重载。所以我需要在 Windows 上使用wfopen

【问题讨论】:

  • 我可能遗漏了一些东西,但UTF-8 需要正常宽度的char* 缓冲区。此外,fstream open 方法只处理文件名,因此文件包含的编码没有区别。您能否更具体地说明为什么使用 fstream 无法打开文件?
  • fstream 读取字符串取决于分配给它的语言环境。
  • 文件名是 UTF8。在上面添加了

标签: c++ utf-8 stream fopen


【解决方案1】:

我可以使用 C 函数 (fopen) 打开一个文件并将该句柄分配给 C++ 文件流 (fstream...) 吗?

不直接,不。但是您可以编写(或找到)一个自定义的std::streambuf 派生类,该派生类使用FILE* 处理I/O,然后将该类的实例分配给标准std::istream 对象。请参阅 std::basic_filebuf 的实现以帮助您,或 GNU 的 stdio_filebuf 类。

我想打开一个路径为 UTF8 字符串的文件。所以文件打开方法必须支持fstream 不支持的UTF8 路径。接受const wchar_t* 的 MSVC 扩展确实有帮助,但 MinGW 不提供这些重载。所以我需要在 Windows 上使用wfopen

Windows 上的大多数 Unicode API 不支持 UTF-8,仅支持 UTF-16。因此,Visual C++ 和其他兼容编译器中的 wchar_t 重载。 Mingw 根本不支持这些扩展。不过,有第 3 方解决方案。例如Pathie(参见Pathie::ifstreamPathie::ofstream 类)。

【讨论】:

  • 在问题中添加:文件名是 UTF8。您是否碰巧知道可以使用它的实现,或者是否有用于此的 boost 组件?
  • 谢谢!库 boost:nowide 也很有帮助,因为它提供了 iofstream 类。 Pathie 可能会替换所有 boost::filesystem 的东西,但我宁愿补充它们。或者你有任何 cmets/经验吗?
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多