C++ 使用std::wofstream写入文件。文件仍然是空的

C++ 使用std::wofstream写入文件。文件仍然是空的,c++,windows,visual-studio,encoding,wofstream,C++,Windows,Visual Studio,Encoding,Wofstream,我使用VS2008编写了以下程序: #include <fstream> int main() { std::wofstream fout("myfile"); fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl; } #包括 int main() { std::wofstream fout(“我的文件”); fout在Visual studio中,输出流始终以ANSI

我使用VS2008编写了以下程序:

#include <fstream>
int main()
{
    std::wofstream fout("myfile");
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
}
#包括
int main()
{
std::wofstream fout(“我的文件”);

fout在Visual studio中,输出流始终以ANSI编码编写,并且不支持UTF-8输出

基本上需要做的是创建一个locale类,将其安装到UTF-8方面,然后将其嵌入到fstream中

如果代码点没有被转换成UTF编码,那么基本上这在MSVC下不起作用,因为它不支持UTF-8

这将在具有UTF-8语言环境的Linux下工作

#include <fstream>
int main()
{
    std::locale::global(std::locale(""));
    std::wofstream fout("myfile");
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
}
#包括
int main()
{
std::locale::global(std::locale(“”);
std::wofstream fout(“我的文件”);
MSVC为这个问题提供了locale方面

#include <codecvt>

// ...  
std::wofstream fout(fileName);
std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
fout.imbue(loc);
#包括
// ...  
std::wofstream fout(文件名);
std::locale loc(std::locale::classic(),新std::codevt_utf8);
fout.imbue(loc);

请随时重新标记我的问题,因为我不完全确定标记是否正确。首先,检查fout.good()以查看fout是否有效(听起来很像,但最好检查代码)@Martin:在我写入之前还是之后?@Xirdus:不,不要。状态位在操作之后才设置。相反,请检查
是否处于打开状态
。非常感谢。但是如果我确实希望它打印整个字符串呢?有什么解决方法吗?是的,安装utf-8 codevt facet。Boost中有很多现成的facet。还有Boost.Locale库,但最后一个一个可能是杀伤力过大。这仍然是使用C++14和VS2015的最佳方式吗?@DerKuchen:致命错误C1083:无法打开包含文件:“codevt”:没有这样的文件或目录。@Armen Tsirunyan:你使用的MSVC版本是什么?至少在MSVC 2010中是这样。@DerKuchen:正如我的帖子所说,我使用的是MSVC2008。那么你是在暗示我不能做我想要的吗关于我的编译器?:(@Armen Tsirunyan:对不起,我忽略了这一点。我在MSVC2008上试过了,但这个版本似乎遗漏了标题。我想我可以下载标题,但我找不到可以下载的。如果可能的话,有什么想法/合法的吗?好的,我不关心的是法律:)
#include <fstream>
int main()
{
    std::locale::global(std::locale("Russian_Russia"));
    std::wofstream fout("myfile");
    fout << L"Россия" << std::endl;
}
#include <codecvt>

// ...  
std::wofstream fout(fileName);
std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
fout.imbue(loc);