使用c++標準庫的iostream,可以方便地將控制台、檔案、字串以及其它可擴充的外部表示作為流來處理,但要處理中文,卻會碰到很多問題。本人原來沒怎麼用過這個iostream,這幾天嘗試用這個寫點東西,一會兒不能輸出中文,一會兒不支援中文檔名的,搞得頭大。網上搜了搜,沒有發現適用於所有情況的解決方案。不過後來自己經過多次測試,基本解決了這些問題,現在寫成文字作為乙個總結,也供碰到同樣問題的朋友參考。關於c語言中的 printf和wprintf的中文輸出,本文也進行了**。
需要說明的是,我的開發環境是vs 2005(標準庫當然也是微軟實現的),不保證其它環境下是相同的效果。
1、cout和wcout
在預設的c locale下,cout可以直接輸出中文,但對於wcout卻不行(至少vs 2005下不行)。對於wcout,需要將其locale設為本地語言才能輸出中文:
wcout.imbue(locale(locale(),"",lc_ctype)); // ①
也有人用如下語句的,但這會改變wcout的所有locale設定,比如數字「1234」會輸出為「1,234」。
wcout.imbue(locale(""));
2、ofstream和wofstream
在預設的c locale下,ofstream能正確輸出中文到檔案中,但不支援中文檔名;wofstream支援中文檔名,但不能向檔案中輸出中文。要解決這個問題,需要在開啟檔案之前將全域性locale設為本地語言。將全域性locale設為本地語言後,ofstream和wofstream的問題都解決了,但 cout和wcout卻不能輸出中文了。要讓cout和wcout輸出中文,需要將全域性locale恢復原來的設定,如下所示:
locale &loc=locale::global(locale(locale(),"",lc_ctype)); // ②
ofstream ofs("ofs測試.txt");
wofstream wofs(l"wofs測試.txt");
locale::global(loc); // ③
ofs<<"test測試"<<1234<3、printf和wprintf
加上這兩位c語言中的老兄,問題更加複雜。考慮如下語句(注意s的大小寫):
printf("%s", "multibyte中文/n"); // ④
printf("%s", l"unicode中文/n"); // ⑤
wprintf(l"%s", "multibyte中文/n"); // ⑥
wprintf(l"%s", l"unicode中文/n"); // ⑦
預設情況下,⑤、⑦兩條語句不能輸出中文,這兩條語句中字串的形式是unicode形式的。如果在所有輸出語句之前加上如下語句將c語言的全域性locale設定為本地語言(c語言中只有全域性locale)就可以正常輸出了:
setlocale(lc_ctype, ""); // ⑧
但這會導致cout和wcout不能輸出中文(汗,的確麻煩),將c語言的全域性locale恢復後cout和wcout就正常了,如下所示:
setlocale(lc_ctype, "c"); // ⑨
但恢復後,printf和wprintf輸出unicode文字又不正常了(輸出multibyte文字總是正常的)。總不能每寫乙個 printf/wprintf就設定一次然後再恢復一次吧?所以,建議不要混用iostream和printf/wprintf,實在要混用,那就讓 printf/wprintf只輸出multibyte字串,這樣不需要呼叫setlocale(),也就不會影響到cout和wcout。
總結
總之,用iostream、printf/wprintf輸出中文,有點麻煩。概括起來要點如下:
ofstream和ifstream詳細用法
ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體,其實所謂的流緩衝就是記憶體空間 在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設的標準輸出流 ...
ofstream和ifstream詳細用法
標籤 c 檔案ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體,其實所謂的流緩衝就是記憶體空間 在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設...
ofstream和ifstream的區別
ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體。在實際應用中,根據需要的不同,選擇不同的類來定義 如果想以輸入方式開啟,就用ifstream 如果想以輸出方式開啟,就用ofstream來定義 如果想以輸入 輸出方式來開啟,就用fstream來定義。如果想讀取乙個檔案的內容,那麼首...