日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题

發(fā)布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:http://blog.csdn.net/code_robot/archive/2010/06/23/5688867.aspx

?

有時候用ifstream或ofstream打開帶有中文路徑的文件會失敗。

解決辦法:
1、使用C語言的函數(shù)設(shè)置為中文運行環(huán)境
setlocale(LC_ALL,"Chinese-simplified");


2、使用STL函數(shù)設(shè)置為系統(tǒng)語言環(huán)境
std::locale::global(std::locale(""));

當(dāng)然選2啦!

?ofstream writefile;

?string filename=("d:/我的文檔/測試.txt");

???? locale loc = locale::global(locale("")); //要打開的文件路徑含中文,設(shè)置全局locale為本地環(huán)境

???? writefile.open(filename.c_str(),ios::out); //打開文件

???? locale::global(loc);//恢復(fù)全局locale

用locale對象的name方法可以看到,通過locale("")構(gòu)造出的locale對象的name為"Chinese_People's Republic of China.936",而原始的locale對象的name為"C",也就是缺省的ANSI_C公約。

注意:如果使用locale loc = locale::global(locale(""))設(shè)置全局locale后沒有用 locale::global(loc)恢復(fù)的話,那么在程序后面的cout語句就不能輸出中文了,雖然這時候操作中文文件沒有問題,但是這也是很容易讓人掉入陷阱的地方,應(yīng)該值得注意。解決方法:

先將CString 轉(zhuǎn)為char*

CString str=view->m_sFilePath;
?? //CString str = "";
?? //ofstream 中傳的參數(shù)不能有漢字,必須轉(zhuǎn)換,一下是其暫緩方法
?? str.AppendFormat("cluster%d%d.txt",aMatrix->X_part,aMatrix->Y_part);
?? char*?? sz?? =?? str.GetBuffer(str.GetLength());
?? locale loc = locale::global(locale(""));
?? ofstream ofile(sz);

轉(zhuǎn)自:http://anwj336.blog.163.com/blog/static/89415209200991931213190/

----------------------------------------------------------------------------------------------------------------------------------------------------


VC 2005中的locale
連續(xù)碰到兩次和locale相關(guān)的問題,一次是ifstream, 一次是boost::format, 做了些實驗記錄下來:

1. ifstream 的文件名參數(shù)其實可以接受char *, 也可以接受wchar_t * 作為參數(shù),如果接受char * 的話,實際上內(nèi)部也是轉(zhuǎn)換成為wchar_t *,但轉(zhuǎn)換的時候問題就來了,如果此文件名里面有漢字,vc2005就轉(zhuǎn)換不對,這樣就打不開文件了。在vc2005中,一開始程序的缺省locale是”C”, 也就是std::locale::classic()返回的,但這個locale下,漢字轉(zhuǎn)換是不正確的,所以,要先用 std::locale::global(std::locale(”"))這樣的語句將locale設(shè)到系統(tǒng)缺省的。實際上std::locale::global(std::locale(”.936″)) 也是一樣的。936就是簡體中文的codepage(代碼頁)。 此時用 locale.name() 打印出來的locale名稱為: “Chinese_People’s Republic of China.936″

2. 但是一旦locale變?yōu)?36了,cout 輸出中文就又會有問題,碰到中文就會斷掉,而且后面的東西再也顯示不出來。這可以通過在ifstream打開文件之后,用std::locale::global(std::locale(”C”))再設(shè)回缺省locale來解決。

3. locale設(shè)為936的另一個問題是,boost::format 中 如果輸出數(shù)字的話,1234會變成1, 234. 這個問題也可以用上面的方法來解決。另外一個方法是可以用format的第二個參數(shù)來做,例如std::locale::classic() 或者std::locale(”C”);

4. 網(wǎng)上說流輸出時候也會將1234變?yōu)?1,234,但我直接實驗cout << 1234 好像沒有問題。看到說碰到這種情況,需要用a.imbue(std::locale(”C”))。

5. 如果ifstream直接用wchar_t *的文件名參數(shù),就很簡單了,由于不更改locale就可以打開文件,后面的cout輸出漢字也沒有問題,boost::format也沒有問題。所以竭力推薦這種方法

---------------------------------------------------------------------------------------------------------------------------------------------

一. locale
?? 一個流在初始化時將隱式地使用全局locale, 而初始時候的全局locale就是標(biāo)準(zhǔn)的"C"模式locale::classic()
在VC與中文版xp下, 也是這樣。

二. 靜態(tài)函數(shù)locale::global(newloc) 可設(shè)置newloc為全局locale,并且返回以前的全局locale,可將之保存起來
以后恢復(fù), 隨時要記得恢復(fù)這點很重要。
?? locale newloc(""); //在簡體中文xp系統(tǒng)上等價于".936"
?? locale& oldloc = locale::global(newloc);
?? ...
?? locale::global(oldloc);
??
?? 純API方式下用
?? setlocale(LC_ALL,"C");???
?? setlocale(LC_ALL,".936"); 也可以用 setlocale(LC_ALL,?? "");

三. Bjarne Stroustrup提到用locale::global(x)的時候?qū)⑼瑫r設(shè)置全局locale,但我在VC中混用API
和stl的來設(shè)置locale時候有些微小的差別,所以今后要注意最好成對地設(shè)置,也就是用API去設(shè)置,以后恢復(fù)也用
API來做,相應(yīng)地,用stl類locale去設(shè)置,也用同樣的類去恢復(fù)回來。
?

轉(zhuǎn)自:http://hi.baidu.com/eith/blog/item/4525a016635f9c5df3de3294.html

總結(jié)

以上是生活随笔為你收集整理的解决:VS 2005/2008 中 fstream 不能处理带有中文路径的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:解决:VS 2005/2008 中 fstream 不能处理