ifstream & ofstream 打开中文路径失败的解决方案

问题:使用ifstream 或者ofstream 打开包含中文的路径失败。

解决方案:

 

方法1

//使用_TEXT()宏定义将字符串常量指定为TCHAR*类型 这种情况下必须是unicode下编译 fstream file; file.open(_TEXT("c://测试//测试文本.txt")); cout<<file.rdbuf(); file.close(); //说明:该方法若字符串为变量类型,则可以考虑使用MultiByteToWideChar将该字符串转化为Unicode编码的字符串。 //该方法适应性最强,首选该方法

 

 

 

方法2

 // 使用STL 中的locale 类的静态方法指定全局locale // 使用该方法以后,cout 可能不能正常输出中文,十分蹊跷 // 我发现了勉强解决的方法:不要在还原区域设定前用cout 或wcout 输出中文 // 否则后果就是还原区域设定后无法使用cout wcout 输出中文 locale::global(locale(""));// 将全局区域设为操作系统默认区域 file.open("c:// 测试// 测试文本2.txt");// 可以顺利打开文件了 locale::global(locale("C"));// 还原全局区域设定 cout<<file.rdbuf(); file.close(); // 说明: 该方法设置为操作系统默认区域的话,有可能出现操作系统是英文的,这样使用上述设置后 // 打开中文路径仍然会失败,这样就必须设置全局区域为中文环境,这样未免太狭隘,换到日文操作系统 // 又要修改代码,所以为了程序的健壮性还是首选方法1  

 

方法3

// 使用C 函数setlocale ,不能用cout 输出中文的问题解决方法同上 setlocale(LC_ALL,"Chinese-simplified");// 设置中文环境 file.open("c:// 测试// 测试文本3.txt");// 可以顺利打开文件了 setlocale(LC_ALL,"C");// 还原 cout<<file.rdbuf(); file.close(); // 说明: 该方法仍然具有STL方案(即方法1)中的问题。

 

 

locale 对象的name 方法可以看到,通过locale("") 构造出的locale 对象的name"Chinese_People's Republic of China.936" ,而原始的locale 对象的name"C" ,也就是缺省的ANSI _C 公约。

注意:如果使用locale loc = locale::global(locale("")) 设置全局locale 后没有用 locale::global(loc) 恢复的话,那么在程序后面的cout 语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让 人掉入陷阱的地方,应该值得注意。

你可能感兴趣的:(c,测试)