标签:
最近维护一个项目,遇到了ifstream在中文路径下打开文件失败的bug,我搜索了一下,最后整理成下文以后日后查阅。
一、问题重现
#include "stdafx.h" #include <Windows.h> #include <fstream> int _tmain(int argc, _TCHAR* argv[]) { std::ifstream infofile; infofile.open(_T("D:\\测试\\test.cpp")); if (infofile.is_open()) { printf("Open success!!!\r\n"); } else { printf("Open fail error code:%d\r\n", GetLastError()); } return 0; }
二、原因分析
三、解决方法
std::ifstream infofile; // 方法1,使用STL中的locale类的静态方法指定全局locale std::locale::global(std::locale("")); //将全局区域设为操作系统默认区域 infofile.open("D:\\测试\\test.cpp"); //可以顺利打开文件了 std::locale::global(std::locale("C")); //还原全局区域设定 // 方法2,使用C函数setlocale TCHAR* ptOldLocale = _tcsdup(_tsetlocale(LC_CTYPE, NULL)); //获取本地语言保存 _tsetlocale(LC_CTYPE, _T("")); //C语言的全局locale设置为本地语言,但这会导致cout和wcout不能输出中文 infofile.open("D:\\测试\\test.cpp"); //可以顺利打开文件了 _tsetlocale(LC_CTYPE, ptOldLocale); //将C语言的全局locale恢复
标签:
原文地址:http://www.cnblogs.com/happyhaoyun/p/4196097.html