2011-06-25 27 views
1

可能重复:
Opening fstream with file with Unicode file name under Windows using non-MSVC compilerMSVC的STL如何用宽字符串文件名打开fstream?

我一直在试图找到一个简单方式在Windows中打开与非ASCII字符的文件在其文件名与海湾合作委员会。微软的STL为fstream类提供了wstring重载,但是标准C++没有,因为`wchar_t'没有很好的定义。

我正在寻找一种方法来打开一个fstream,当给定std::wstring为文件名,在标准的C + +和Win32 API。

我做不是想创建我自己的streambuf子类,需要std::wstring和模仿fstream。我需要模仿fstream::open(const std::wstring &)(或任何它声明)功能,所以我可以打开奇怪的命名文件没有一个困难。

我已经想到使用短的DOS 8.3文件名,但GetShortPathName接受并输出宽字符串,不适用于STL构造函数/打开函数。我确实有方法转换为不同的代码页,所以也许将宽字符串转换为本地代码页会给出正确的8位字符串,允许我打开fstream

+0

@raj:哦,是的,我忘了提,Boost,它可能对我来说有点太侵扰了。我需要一个结合了Win32 API的'std :: fstream + std :: wstring'。 MSVC STL做到这一点,我只是不知道如何:( – rubenvb

+0

您是否尝试过使用WideCharToMultiByte并将结果传递给gcc fstream :: open?只有当wstring可以在当前本地代码页中正确表达 –

+0

@raj :如果当前的本地代码页不能代表文件名,那么文件名会在资源管理器中看起来如何?或者,如果用'dir'命令打印出来,你会如何告诉'delete'删除文件?你不需要做通过一些本地代码页,我发现这令人沮丧,它似乎是可能的,但似乎没有人知道如何。 – rubenvb

回答

1

好的,对于那些感兴趣的人,我向libstdC++提交了一个补丁来获得这个排序,eurh ...添加缺少的功能。我已经测试了代码,现在我只需要将它添加到libstdC++中,就像开发人员需要的那样(使用必需的#if和configure检查)。

因此,长话短说:GCC 4.7的libstdC++将支持fstream以宽文件名打开,就像在MSVC的STL中一样。我会看看libC++是否也可以包含这个功能,虽然其余的库在Windows上根本不工作...

+1

好现在有成千上万的程序员习惯了这个超载而不知道它实际上不是C++的一部分 –

+0

@ Tomalak:嗯,它只会在Windows上,因为实际上没有明智的方法来做这件事,或者你应该对这个问题提出一个很好的答案,并且阻止我添加一组简单的重载这使得Windows C++程序员的生活变得非常容易 – rubenvb

+0

@rubenvb:我不需要对这个问题提交一个很好的答案,因为在这个问题上已经有很好的答案e是重复的。 :) –

相关问题