VS2005的fstream對於中文路徑支持

幾天發了這篇《用fstream對二進制文件的讀寫》,有朋友指出了VS2005的fstream對於中文路徑支持不好的bug。我想大概是因爲VS2005更加重視了對字符串的全球化支持,所以鼓勵我們使用unicode編碼的字符串,對於MBCS之類的支持可能就疏忽了吧。

   我搜索了一下這個問題的解決,參考瞭如下資料寫了演示代碼。

fstream 和 中文路徑 c++博客
About unicode settings in visual studio 2005, it really puzzled me a lot ms forum
MSDN
   我綜合了以上的內容,總結了3種方法,能夠較好解決大家的困擾,包括可能無法使用cout的問題。

   1: /********************************************************************   2:     created:    2008/05/10   3:     created:    10:5:2008   23:56   4:     filename:     k:/sj/fstreamTest/fstreamTest/main.cpp   5:     file path:    k:/sj/fstreamTest/fstreamTest   6:     file base:    main   7:     file ext:    cpp   8:     author:        Gohan   9: *********************************************************************/  10: #include <tchar.h>  11: #include <fstream>  12: #include <iostream>  13: using namespace std;  14: int main()  15: {  16:     /************************************************************************/  17:     /* 方法1,使用_TEXT()宏定義將字符串常量指定爲TCHAR*類型                 */  18:     /* 如果是我,首選此類型                                                 */  19:     /************************************************************************/  20:     fstream file;  21:     file.open(_TEXT("c://測試//測試文本.txt"));  22:     cout<<file.rdbuf();  23:     file.close();  24:   25:     /************************************************************************/  26:     /* 方法2,使用STL中的locale類的靜態方法指定全局locale                   */  27:     /* 使用該方法以後,cout可能不能正常輸出中文,十分蹊蹺                    */  28:     /* 我發現了勉強解決的方法:不要在還原區域設定前用cout或wcout 輸出中文   */  29:     /* 否則後果就是還原區域設定後無法使用cout wcout輸出中文                 */  30:     /************************************************************************/  31:     locale::global(locale(""));//將全局區域設爲操作系統默認區域  32:     file.open("c://測試//測試文本2.txt");//可以順利打開文件了  33:     locale::global(locale("C"));//還原全局區域設定  34:     cout<<file.rdbuf();  35:     file.close();  36:   37:     /************************************************************************/  38:     /* 方法3,使用C函數setlocale,不能用cout輸出中文的問題解決方法同上      */  39:     /************************************************************************/  40:     setlocale(LC_ALL,"Chinese-simplified");//設置中文環境  41:     file.open("c://測試//測試文本3.txt");//可以順利打開文件了  42:     setlocale(LC_ALL,"C");//還原  43:     cout<<file.rdbuf();  44:     file.close();  45: }
補充一下,第一種方法,如果不是靜態字符串當作路徑的話,記得傳入TCHAR*類型字符串作爲路徑,應該就沒問題了。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/fengzhijiaxu/archive/2009/11/18/4829229.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章