2014-07-24 57 views
4

我尝试着写一些wchar_t *到文件,但编译后的程序的命令行输出如下所示。当试图写希腊字符串时,程序基本上是挂起的。下面写入wofstream会产生异常

#include <iostream> 
#include <stdio.h> 
#include <fstream> 
#include <wchar.h> 
using namespace std; 

int main(int argc, char **argv) 
{ 

    printf("%s\n",setlocale(LC_ALL,"")); 
    wofstream f("xxx.txt", ios::out); 
    if(f.is_open()) 
    { 
     try 
     { 
      f.write(L"good",4); 
      f.flush(); 
      f.write(L"καλημερα",8); 
      f.close(); 
     } 
     catch (int e) 
     { 
      cout << "An exception occurred. Exception Nr. " << e <<endl; 
     } 

     printf("hello world\n"); 
     return 0; 
    } 
} 

为什么

el_GR.UTF-8 
terminate called after throwing an instance of 'int' 
Ακυρώθηκε (core dumped) 

源代码?

+0

这是一个错误,因为没有在输入输出流应该永远抛出一个int。什么是编译器和整个系统?有警告吗?源代码的编码是什么?最后,'e'的价值是什么? –

+0

e的值是20.我使用g ++编译时没有警告。这看起来应该是一种初始化。 –

回答

1

流不会从环境中获取语言环境。 我addeed:

#include <locale> 
locale loc("el_GR.utf8"); 
f.imbue(loc); 

所以流现在持有使用(如果我说错了请纠正)的语言环境。

能正确运行的代码是:

#include <iostream> 
#include <stdio.h> 
#include <fstream> 
#include <wchar.h> 
#include <locale> 


using namespace std; 

int main(int argc, char **argv) 
{ 
    locale loc("el_GR.utf8"); 
    wcout<<"Hi I am starting Ξεκινάμε"<<endl; 
    cout<<"%s\n"<<setlocale(LC_ALL,"en_US.utf8")<<endl; 
    wofstream f("xxx.txt", ios::out); 
     if(f.is_open()){ 
      f.imbue(loc); 

      f.write(L"good",4);f.flush(); 
      f.write(L"καλημέρα",8); 
      f.close(); 
      cout<<"fileClosed"<<endl; 
    } 

    cout<<"hello world"<<endl; 
    return 0; 


} 
+0

您可以使用'getenv'从环境中获取语言环境。 – Brian

+1

或者只是使用locale loc(setlocale(LC_ALL,“”))'将所有相关的环境考虑在内...... –

+0

我用f.imbue(locale(setlocale(LC_ALL,“”)));它的工作原理 –