Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;fstreams以utf-16名称打开文件_C++_Windows_Qt - Fatal编程技术网

C++ c++;fstreams以utf-16名称打开文件

C++ c++;fstreams以utf-16名称打开文件,c++,windows,qt,C++,Windows,Qt,起初,我在Linux上构建了我的项目,它是围绕streams构建的 当我开始使用Windows时,我遇到了一些问题。 我有一个要以UTF-16编码打开的文件名。 我尝试使用fstream进行此操作: QString source; // content of source is shown on image char *op= (char *) source.data(); fstream stream(op, std::ios::in | std::ios::binary); 但文件

起初,我在Linux上构建了我的项目,它是围绕streams构建的

当我开始使用Windows时,我遇到了一些问题。
我有一个要以UTF-16编码打开的文件名。

我尝试使用fstream进行此操作:

QString source;  // content of  source  is shown on image
char *op= (char *) source.data();
fstream stream(op, std::ios::in | std::ios::binary);
但文件无法打开。
当我检查时

 if(!stream.is_open())
   {}  // I always get that  it's not opened. But file indeed exists.
我试着用wstream做这件事。但结果是一样的,因为wstream也只接受char*。据我所知是这样的,因为作为char*发送的字符串在第一个零之后被截断,并且只发送文件名的一个符号,所以永远找不到文件。我知道Vissual studio中的wfstream可以接受wchar_t*行作为名称,但我选择的编译器是MinGW,它没有WSString构造函数的签名

有什么方法可以用STL流来实现吗

添加
该字符串不仅可以包含Ascii符号,还可以同时包含俄文、德文和中文符号。我不想把自己局限于ASCII或本地编码

下一次添加
数据也可以是不同的,不仅仅是ASCII,否则我根本不会为Unicode而烦恼。 例如


提前谢谢

>特别是页眉可能有帮助。

< P>特别是页眉可能有帮助。

< P>在将文件名传递给FString之前,使用CPYACP转换UTF 16字符串。

< P>在将文件名传递给FString之前,使用CPUACP转换UTF 16字符串。

< P>如果使用MSVC,则是C++标准库的实现,像这样的方法应该会奏效:

QString source;  // content of  source  is shown on image
wchar_t *op= source.data();
fstream stream(op, std::ios::in | std::ios::binary);

这是因为微软C++实现有一个扩展,允许FString用宽字符串打开。

如果你使用MSVC,它是C++标准库的实现,这样的事情应该是:

QString source;  // content of  source  is shown on image
wchar_t *op= source.data();
fstream stream(op, std::ios::in | std::ios::binary);


这是因为微软C++实现了一个扩展,允许FString用宽字符串打开。

@ qpCR4vIR:它是如何关联的?为什么使用Qt,而喜欢<代码> STD::FStrase > <代码> qFrase>代码>?我不想把它贴得太近。我想留点机会让自己摆脱困境it@qPCR4vir:它是如何关联的?为什么你使用Qt,但更喜欢
std::fstream
而不是
QFile
?我不想把我和它联系得太近。我想给自己留点机会从中解脱出来,不是每个文件都可以通过这种方式访问。如果文件名包含当前ANSI代码页中不存在的字符…是的,但这是fstream实现的一个限制。说
fstream
s是有限的,然后假装问题不存在对我来说似乎是个坏主意。是否有一些非可移植的C++类最终调用<代码> CreateFileW <代码>来打开文件?这似乎更适合提问者。首先,建议使用
QFile
。并不是每个文件都可以通过这种方式访问。如果文件名包含当前ANSI代码页中不存在的字符…是的,但这是fstream实现的一个限制。说
fstream
s是有限的,然后假装问题不存在对我来说似乎是个坏主意。是否有一些非可移植的C++类最终调用<代码> CreateFileW <代码>来打开文件?似乎这更适合提问者。首先,有人建议使用
QFile
。呃,不幸的是,我使用了Mingw(那么boost::filesystem的fstream实现是最好的答案。可能还有一种解决方案使用了Mingw和libstdc++扩展。呃,不幸的是,我使用了Mingw(那么boost::filesystem的fstream实现就是最好的答案。也可能有一个使用mingw和libstdc++扩展的解决方案。