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

新手上路,请多包涵

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

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

当我尝试编译它时,IDE 询问我是否想以 unicode 格式保存我的源文件,我说“是的,请”。

然后我运行程序,myfile 出现在我的项目文件夹中。我用记事本打开它,文件是空的。我记得记事本只支持 ASCII 数据。我用写字板打开它,它仍然是空的。最后,我内心的小天才敦促我查看文件大小,毫不奇怪它是 0 字节。所以我重建并重新运行程序,没有效果。最后,我决定在 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";
    }
}

建造它。跑了。而且……控制台清楚地显示,令我惊讶的是:“之后:不好……”。所以我编辑了我的帖子以提供新信息,并开始等待答案来解释为什么会这样以及我能做什么。 :)

原文由 Armen Tsirunyan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

在 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

原文由 Artyom 发布,翻译遵循 CC BY-SA 3.0 许可协议

MSVC 为这个问题提供了 codecvt_utf8 语言环境方面。

 #include <codecvt>

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

原文由 DerKuchen 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏