fstream預設不支援中文路徑和輸出整數帶逗號的解決辦法

SurgePing發表於2014-01-17

今天專案中打日誌,發現帶中文路徑名就不能成功建立,經網上了解,發現c++的一套檔案IO庫,預設是不支援中文路徑的。

下面我們用fstream來建立一個新檔案,如果檔案路徑中帶有中文,則建立一般會失敗。如下面程式碼:

  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <string>  
  4. #include <direct.h>  
  5.   
  6. using namespace std;  
  7.   
  8. void main()  
  9. {  
  10.     _mkdir("測試");      //新建一箇中文資料夾  
  11.     ofstream outfile( "測試/test.txt", ios::out );     //建立檔案  
  12.     if( !outfile )  
  13.     {  
  14.         cout << "Failed to create file!";  
  15.         return ;  
  16.     }  
  17.         outfile.close();  
  18. }  

程式將輸出建立資料夾失敗的資訊。

一個解決辦法是:中文作業系統下,呼叫locale::global(std::locale("")),將全域性區域設定為中文,如下例:

  1. #include <iostream>  
  2. #include <fstream>  
  3. #include <string>  
  4. #include <direct.h>  
  5.   
  6. using namespace std;  
  7.   
  8. void main()  
  9. {  
  10.     locale::global(std::locale(""));     //將全域性區域設為作業系統預設區域,以支援中文路徑  
  11.     _mkdir("測試");      //新建一箇中文資料夾  
  12.     ofstream outfile( "測試/test.txt", ios::out );     //建立檔案  
  13.     if( !outfile )  
  14.     {  
  15.         cout << "Failed to create file!";  
  16.         return ;  
  17.     }  
  18.     int i = 123456789;  
  19.     outfile << "i = " << i << "/n";   //輸出帶逗號  
  20.          outfile.close();  
  21.     setlocale( LC_ALL, "C" );     //恢復全域性locale,如果不恢復,可能導致cout無法輸出中  
  22. }  

      建立檔案成功,在程式的“測試”檔案下出現個test.txt檔案。需要注意的是最後需要呼叫setlocale( LC_ALL, "C" )還原,否則會出現未知錯誤。 

      此時我們發現,test.txt中的i值顯示為123,456,789,出現了逗號。這是因為中文習慣問題。我們在讀取檔案的時候,讀入i值時,可能讀入一個值為123的整數,並不是我們希望的123456789,所以我們寫檔案時,希望不要寫入逗號。一個辦法是現將整數轉換為字串再進行輸出,如:

  1. int i = 123456789;  
  2. char ch[20];  
  3. sprintf((char *)&ch, "%d", i);    //整數資料轉換為字元陣列。  
  4. outfile << "i = "  << ch << '/n';  //輸出不帶逗號  

      上述問題的解決方法有很多,大家可以試試。

相關文章