幾天發了這篇《用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