为C ++文件流分配C文件句柄

时间:2017-09-26 03:13:08

标签: c++ utf-8 stream fopen

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

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

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

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

1 个答案:

答案 0 :(得分:1)

  

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

不直接,不。但是您可以编写(或查找)使用FILE*处理I / O的自定义std::streambuf派生类,然后将该类的实例分配给标准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根本不支持这些扩展。但是,有第三方解决方案。例如Pathie(请参阅Pathie::ifstreamPathie::ofstream类)。