ifstream打开含中文路径名文件失败的原因
来源:互联网 发布:7号信令网络组成 编辑:程序博客网 时间:2024/04/25 21:42
(源自:http://blog.csdn.net/suhuaiqiang_janlay/article/details/5963867)
首先,用一个简单的例子来重现一下我所遇到的问题:
(1)在VS2008的“Property Pages”属性页中,选择“Configuration Properties”-->“General”,可以看到当前使用的字符集是“Multi-Byte Character Set”,也就是说程序中使用的是多字节字符集。
(2)接下来看看ifstream打开txt文件的简单代码:
1 #include "stdafx.h" 2 #include <fstream> 3 #include <iostream> 4 using namespace std; 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 ifstream infile("d://测试.txt"); 8 if(infile.is_open()) 9 {10 cout<<"Open Success!";11 }12 else13 {14 cout<<"Open Fail!";15 }16 return 0;17 }
(3)运行结果:输出“Open Fail” (打开文件失败!)
从设置选项中可以看到,工程中使用的字符集可设置为“Multi-Byte Character Set”或“Unicode Character Set”,其中“Multi-Byte Character Set”表示使用ANSI编码方式,“Unicode Character Set”表示使用UNICODE编码方式。
那么这两种编码方式有什么样的区别呢?
(1)传统的计算机使用ANSI编码,在ANSI编码模式下,英文字符都用1个字节表示,而某些其它国家的文字(如汉字、日文),无法用单个字节来表示,ANSI便采用多个字节来表示这些字符(汉字是2个字节)。
(2)UNICODE包含UTF-8、UTF-16、UTF-32等多种编码方案(目前windows一般使用UTF-16)。拿UTF-16来说,规定所有字符都使用2个字节表示(不论英文字母还是汉字),对于超出2个字节范围的字符采用代理(采用4个字节表示)。
UNICODE相比ANSI有很多方面的优势(优势体现在哪?),微软非常提倡使用UNICODE编码方式,在MS较新版本的系统中都是采用UNICODE编码的。因此,即便我们在自己写的程序中使用了ANSI编码,系统会将其转换为UNICODE再对其进行处理。
接下来我们说一下ifstream。在调用ifstream的open方法时,系统内部调用mbstowcs_s进行文件名转换(mbstowcs_s函数的作用是把多字节字符转化为宽字符),需要注意的是,该函数的调用结果依赖于程序的本地化设置(什么是本地化设置?)。而本地化设置可以通过setlocale函数来设置,譬如:setlocale(LC_ALL, "chinese")表示将程序本身的语言设置为中文,而程序启动时默认设置为LC_ALL="C"。在使用mbstowcs_s进行字符串转换时,只有当LC_ALL="chinese"时,含中文的字符串才能正确的转换成其对应的宽字节字符,否则(在LC_ALL="C"时),汉字会被看成2个单字节的字符,然后再转换成宽字节的字符,这样转换的结果显然是错误的!这就是ifstream打开含中文路径的文件失败的原因,因为"d://测试.txt"转换后得到错误的路径,因此文件打不开!
解决方法如下:
1 /*方法1, 2 使用STL中的locale类的静态方法指定全局locale 3 使用该方法以后,cout可能不能正常输出中文,十分蹊跷 4 我发现了勉强解决的方法:不要在还原区域设定前用cout或wcout输出中文, 5 否则后果就是还原区域设定后无法使用cout wcout输出中文 6 */ 7 locale::global(locale(""));//将全局区域设为操作系统默认区域 8 file.open("d://测试//测试文本.txt");//可以顺利打开文件了 9 locale::global(locale("C"));//还原全局区域设定10 cout<<file.rdbuf();11 file.close();
1 /* 方法2,使用C函数setlocale,不能用cout输出中文的问题解决方法同上 */2 setlocale(LC_ALL,"Chinese-simplified");//设置中文环境3 file.open("c://测试//测试文本3.txt");//可以顺利打开文件了4 setlocale(LC_ALL,"C");//还原5 cout<<file.rdbuf();6 file.close();
- ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因
- 剖析ifstream打开含中文路径名文件失败的原因(转)
- 剖析ifstream打开含中文路径名文件失败的原因
- ifstream打开含中文路径文件时失败的问题
- ifstream打开含中文路径文件时失败的问题
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- vs2008 std::fstream以及std::ifstream打开中文路径名失败的解决方法
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- 有时候用ifstream或ofstream打开带有中文路径的文件会失败。 解决办法
- ifstream或ofstream打开带有中文路径的文件失败解决方法
- 专访Databricks辛湜,谈Spark排序比赛摘冠及生态圈热点-2014
- 该公众号暂时无法提供服务请稍后再试
- linux中errno的使用以及return返回值问题
- 程矢Axure夜话:中继器系列视频教程之中继器表格中添加图像
- 串口编程
- ifstream打开含中文路径名文件失败的原因
- OpenGL简明笔记2——纹理贴图
- 程矢Axure夜话:中继器系列视频教程之中继器表格统计
- hdu3665 seaside(floyd算法)
- Google Play 中用到的开源代码
- 姓名预测,个性匹配与运势——预测1:世界末日
- static修饰的变量及函数
- 用C语言实现,文件打开,程序用时,随机数生成
- win8下cocos2dx-3.2+VS2012环境配置及项目创建