今天使用在使用ifstream和ofstream创建文件和读取文件时,发现在中文路径下一直失败,而在英文路径下则一切OK。
后来一查,原来是fstream的问题,微软在实现ifstream的open方法时,调用了mbstowcs_s先进行文件名转换,但mbstowcs_s依赖于当前的locale的CTYPE设置,默认CTYPE为C,也就是假定所有的字符都只有一个字节长,微软对这种情况下进行了特殊的转换处理:
/* C locale: easy and fast */
while (count < n)
{
*pwcs = (wchar_t) ((unsigned char)s[count]);
if (!s[count])
return count;
count++;
pwcs++;
}
否则使用的是MultiByteToWideChar进行转换。所以有中文等多字节字符时就出错了。
解决办法:
1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"Chinese-simplified");
2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));
但是据说这样之后cout又不能输出中文了。
3. 传入 Unicode 字符串.
wchar_t path[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, FilePath, (int)(strlen(FilePath)+1), path, MAX_PATH);
std::ifstream ifs;
ifs.open(wchar_path);
注:传入strlen(FilePath)+1,是为了将结束标识 '\0' 也转化成 宽字符。
posted on 2007-12-11 22:50
李阳 阅读(1505)
评论(0) 编辑 收藏 引用 所属分类:
C++