C++里Ofstream写文件的中文问题
问题1:中文路径问题导致文件打开失败。
通常是因为在调用fstream的open方法时,系统内部调用mbstowcs_s进行文件名转换,而mbstowcs_s依赖于程序的本地化设置(locale系列函数设置)。
程序启动时默认设置为LC_ALL="C"。而要正确打开中文文件名的文件,需要设置为LC_ALL="chinese"。
问题2.无法输出中文。
这个原因刚好和问题1相反!在默认的C locale下wofstream无法输出中文!要输出中文,又得将LC_ALL设置回来!(即LC_ALL="C")
看上去要解决这2个办法,就要在打开文件的时候保证使用locale "C",而在写中文的时候保证使用locale "chinese"!
如果不想频繁的切换,那么最好的解决办法是把项目设置为UNICODE。以下代码可以顺利通过测试。
[cpp]
ofstream ofile("d://测试//测试.txt");
if(ofile.is_open())
{
ofile << 123456 << endl;//输出正确
ofile << "中文1" << endl;//输出成功
ofile << _T("中文2") << endl;//ofstream无易做图确输出此处的Unicode字符串!
}
else
{
cout<<"Open Fail!";
}
wofstream wofile("d://测试//测试w.txt");
if(wofile.is_open())
{
wofile.imbue(locale( "", locale::all ^ locale::numeric));
wofile << 123456 << endl;//输出正确
wofile << "中文1" << endl;// wofstream无易做图确输出此处的ansi字符串!
wofile << _T("中文2") << endl;//输出正确
}
else
{
cout<<"Open Fail!";
}
还有很关键的一点!注意这里的locale( "", locale::all ^ locale::numeric)!
“”表示表示使用本地语言,这里当然相当于“chs”或者“chinese”。
locale::all表示使用该语言的所有格式设置进行编码转换!
^是异或,locale::numeric表示数字格式。这里的意思是避免转换数字格式!否则123456输出结果会成为123,456这种形式!
补充:软件开发 , C++ ,