公司有一个项目从vs2003移植到vs2005之后老是出现runtim erro
经过排查最终定位在fstream 打开"含中文路径"的文件时候会出现fail的情况
本来不相信vs2003过渡到2005会有这个问题,但是经过试验确证实了该问题
我新建立一个exe来测试该问题
vs2003不需要作任何设置就可以就可以成功
但是vs2005下每次都会失败在断言处,查找了一些网上资料,例如
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=371229&SiteID=1
发现但凡是uinicode的路径都是有该问题的.
解决方法有2个
1.第一个使用vs2005默认的unicode set并在所有字符串外面面加上_T() 或者_TEXT宏,代价是原来所有不符合unicode规范的地方你都必须得改.
2.使用not set 或者"mutibyte set" 并在程序初始化的时候调用setlocale()如下
上述引用的ms论坛连接基本讲清楚了该问题,但是由于我前几日搜索中文相关信息时候,实在未发现有用之内容,故记录下来,希望有相同问题又不思其解的朋友可以少花点时间.
经过排查最终定位在fstream 打开"含中文路径"的文件时候会出现fail的情况
本来不相信vs2003过渡到2005会有这个问题,但是经过试验确证实了该问题
我新建立一个exe来测试该问题
1#include "stdafx.h"
2#include "testiostream.h"
3#include <string>
4#include <fstream>
5
6
7 BEGIN_MESSAGE_MAP(CtestiostreamApp, CWinApp)
8 END_MESSAGE_MAP()
9
10 CtestiostreamApp::CtestiostreamApp()
11 {
12}
13
14 CtestiostreamApp theApp;
15
16 BOOL CtestiostreamApp::InitInstance()
17 {
18 CWinApp::InitInstance();
19 std::ifstream iput;
20 iput.open("F://中文.txt");
21 ASSERT(!iput.fail());
22 return FALSE;
23}
2#include "testiostream.h"
3#include <string>
4#include <fstream>
5
6
7 BEGIN_MESSAGE_MAP(CtestiostreamApp, CWinApp)
8 END_MESSAGE_MAP()
9
10 CtestiostreamApp::CtestiostreamApp()
11 {
12}
13
14 CtestiostreamApp theApp;
15
16 BOOL CtestiostreamApp::InitInstance()
17 {
18 CWinApp::InitInstance();
19 std::ifstream iput;
20 iput.open("F://中文.txt");
21 ASSERT(!iput.fail());
22 return FALSE;
23}
vs2003不需要作任何设置就可以就可以成功
但是vs2005下每次都会失败在断言处,查找了一些网上资料,例如
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=371229&SiteID=1
发现但凡是uinicode的路径都是有该问题的.
解决方法有2个
1.第一个使用vs2005默认的unicode set并在所有字符串外面面加上_T() 或者_TEXT宏,代价是原来所有不符合unicode规范的地方你都必须得改.
2.使用not set 或者"mutibyte set" 并在程序初始化的时候调用setlocale()如下
BOOL CtestiostreamApp::InitInstance()
{
setlocale(LC_ALL,"Chinese-simplified");
CWinApp::InitInstance();
std::ifstream iput;
iput.open("F://中文.txt");
ASSERT(!iput.fail());
return FALSE;
}
就可以解决该问题{
setlocale(LC_ALL,"Chinese-simplified");
CWinApp::InitInstance();
std::ifstream iput;
iput.open("F://中文.txt");
ASSERT(!iput.fail());
return FALSE;
}
上述引用的ms论坛连接基本讲清楚了该问题,但是由于我前几日搜索中文相关信息时候,实在未发现有用之内容,故记录下来,希望有相同问题又不思其解的朋友可以少花点时间.