今天项目中打日志,发现带中文路径名就不能成功创建,经网上了解,发现c++的一套文件IO库,默认是不支持中文路径的。
下面我们用fstream来创建一个新文件,如果文件路径中带有中文,则创建一般会失败。如下面代码:
- #include
<iostream> - #include
<fstream> - #include
<string> - #include
<direct.h> -
- using
namespace std; -
- void
main() - {
-
_mkdir("测试"); //新建一个中文文件夹 -
ofstream outfile( "测试/test.txt", ios::out ); //创建文件 -
if( !outfile ) -
{ -
cout << "Failed to create file!"; -
return ; -
} -
outfile.close(); - }
程序将输出创建文件夹失败的信息。
一个解决办法是:在中文操作系统下,调用locale::global(std::locale("")),将全局区域设置为中文,如下例:
- #include
<iostream> - #include
<fstream> - #include
<string> - #include
<direct.h> -
- using
namespace std; -
- void
main() - {
-
locale::global(std::locale("")); //将全局区域设为操作系统默认区域,以支持中文路径 -
_mkdir("测试"); //新建一个中文文件夹 -
ofstream outfile( "测试/test.txt", ios::out ); //创建文件 -
if( !outfile ) -
{ -
cout << "Failed to create file!"; -
return ; -
} -
int i = 123456789; -
outfile << "i = " << i << "/n"; //输出带逗号 -
outfile.close(); -
setlocale( LC_ALL, "C" ); //恢复全局locale,如果不恢复,可能导致cout无法输出中文 - }
- int
i = 123456789; - char
ch[20]; - sprintf((char
*)&ch, "%d", i); //整数数据转换为字符数组。 - outfile
<< "i = " << ch << '/n'; //输出不带逗号