公司有一個(gè)項(xiàng)目從vs2003移植到vs2005之后老是出現(xiàn)runtim erro
經(jīng)過(guò)排查最終定位在fstream 打開(kāi)"含中文路徑"的文件時(shí)候會(huì)出現(xiàn)fail的情況
本來(lái)不相信vs2003過(guò)渡到2005會(huì)有這個(gè)問(wèn)題,但是經(jīng)過(guò)試驗(yàn)確證實(shí)了該問(wèn)題
我新建立一個(gè)exe來(lái)測(cè)試該問(wèn)題

?1#include?"stdafx.h"
?2#include?"testiostream.h"
?3#include?<string>
?4#include?<fstream>
?5
?6
?7BEGIN_MESSAGE_MAP(CtestiostreamApp,?CWinApp)
?8END_MESSAGE_MAP()
?9
10CtestiostreamApp::CtestiostreamApp()
11{
12}

13
14CtestiostreamApp?theApp;
15
16BOOL?CtestiostreamApp::InitInstance()
17{
18????CWinApp::InitInstance();
19????std::ifstream?iput;
20????iput.open("F:\\中文.txt");
21????ASSERT(!iput.fail());
22????return?FALSE;
23}

vs2003不需要作任何設(shè)置就可以就可以成功
但是vs2005下每次都會(huì)失敗在斷言處,查找了一些網(wǎng)上資料,例如
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=371229&SiteID=1
發(fā)現(xiàn)但凡是uinicode的路徑都是有該問(wèn)題的.
解決方法有2個(gè)
1.第一個(gè)使用vs2005默認(rèn)的unicode set并在所有字符串外面面加上_T() 或者_(dá)TEXT宏,代價(jià)是原來(lái)所有不符合unicode規(guī)范的地方你都必須得改.
2.使用not set 或者"mutibyte set" 并在程序初始化的時(shí)候調(diào)用setlocale()如下

BOOL?CtestiostreamApp::InitInstance()
{
?????setlocale(LC_ALL,
"Chinese-simplified");
????CWinApp::InitInstance();
????std::ifstream?iput;
????iput.open(
"F:\\中文.txt");
????ASSERT(
!iput.fail());
????
return?FALSE;
}
就可以解決該問(wèn)題

上述引用的ms論壇連接基本講清楚了該問(wèn)題,但是由于我前幾日搜索中文相關(guān)信息時(shí)候,實(shí)在未發(fā)現(xiàn)有用之內(nèi)容,故記錄下來(lái),希望有相同問(wèn)題又不思其解的朋友可以少花點(diǎn)時(shí)間.