使用std :: wofstream写入一个文件。 该文件保持空白

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

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

当我试图编译它时,IDE问我是否想用unicode保存我的源文件,我说“是的,请”。
然后我运行该程序,myfile出现在我的项目文件夹中。 我用记事本打开它,文件是空的。 我记得记事本只支持ASCII数据。 我用写字板打开它,它仍然是空的。 最后,我的小天才催促我看看文件大小,毫不奇怪,它是0字节。 所以我重build并重新编程,没有任何效果。 最后,我决定问StackOverflow非常聪明的人,我失去了什么,在这里我:)

编辑:

上述智能人留下一些意见后,我决定按照他们的意见,并重写这样的程序:

 #include <fstream> #include <iostream> int main() { std::wofstream fout("myfile"); if(!fout.is_open()) { std::cout << "Before: Not open...\n"; } fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl; if(!fout.good()) { std::cout << "After: Not good...\n"; } } 

build造它。 跑吧。 而且……主持人清楚地读到,令我惊讶的是:“之后:不好……”。 所以我编辑我的post提供新的信息,并开始等待答案,这将解释为什么这是我能做的。 🙂

在Visual Studio中,输出流总是以ANSI编码写入,并且不支持UTF-8输出。

基本上需要做的是创建一个语言环境类,安装到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; } 

〜在Windows下这将工作:

 #include <fstream> int main() { std::locale::global(std::locale("Russian_Russia")); std::wofstream fout("myfile"); fout << L"Россия" << std::endl; } 

由于只有MSVC支持ANSI编码。

Codecvt方面可以在一些Boost库中找到。 例如: http : //www.boost.org/doc/libs/1_38_0/libs/serialization/doc/codecvt.html

MSVC为这个问题提供了codecvt_utf8 locale facet。

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