/ / / / / /

上一篇 下一篇 同標題 發表文章 文章列表

作者  weihan (天天天藍) 站內  CPP_DS
標題  如何使用寬字元於輸出/輸入串流迭代器
時間  2013/03/30 Sat 08:51:17

由於我現在很常用到寬字元,寬字串,於是 C++ 內的有些功能當延伸到寬字元時,
有時需要加以調整。以下是在使用串流迭代器,我於書上增修的部份:

================================

如果程式的輸入/輸出是使用寬字元 (wchar_t) 時,則除須額外設定語系資料外,
同時也須在串流迭代器內增加第二個型別樣板參數 wchar_t,例如:以下為列印
整數陣列,並在每個輸出的末尾加上  L"00 " 寬字元字串。


// 設定語系
setlocale( LC_ALL , "zh_TW.UTF-8" ) ;

int  no[5] = { 1 , 2 , 3 , 4 , 5 } ;

// 印出 no 整數陣列,並在每個整數之後加印 L"00 "
copy( no , no+5 ,
      ostream_iterator<int,wchar_t>(wcout,L"00 ") ) ;
                           ^^^^^^^
wcout << endl ;

程式輸出:

100 200 300 400 500


請留意,以上串流迭代器的第一個型別樣板參數為所要列印的資料型別 int,
第二個型別樣版型別參數才是設為 wchar_t,處理寬字元的輸出串流物件為 wcout。
以下程式碼是利用寬字串 (wstring) 將輸入的寬字元之後加上一個
空格後印出:

// 設定語系
setlocale( LC_ALL , "zh_TW.UTF-8" ) ;

// 寬字串
wstring  foo ;

// 將輸入的寬字元存入 foo 寬字串
copy( istream_iterator<wchar_t,wchar_t>(wcin) ,
      istream_iterator<wchar_t,wchar_t>() , back_inserter(foo) ) ;

// 列印寬字串 foo 並在每個寬字元之後加上一個空格
copy( foo.begin() , foo.end() ,
      ostream_iterator<wchar_t,wchar_t>(wcout,L" ") ) ;

wcout << endl ;


這裡的 wcin 是用在處理寬字元的輸入串流物件。由於寬字串是由寬字元所
構成的,因此串流迭代器的第一個型別樣板參數也是 wchar_t。
以上程式在執行時若輸入 「西元 2012 年」 等寬字元,則在程式中 foo 寬字串
儲存 L"西元2012年" 共七個寬字元,執行後程式會輸出:

西 元 2 0 1 2 年


若資料是要由檔案讀入,經過程式處理後存到新檔,則須仿照第 ? 頁的方式
利用 {\tt imbue} 成員函式分別在輸入與輸出檔案串流物件設定使用的語系,
例如:

locale  utf8("zh_TW.UTF-8") ;

wifstream  infile("foo.dat") ;
infile.imbue(utf8) ;

wstring  wstr ;

// 由 foo.dat 檔案讀入寬字元存到寬字串 wstr 內
copy( istream_iterator<wchar_t,wchar_t>(infile) ,
      istream_iterator<wchar_t,wchar_t>() , back_inserter(wstr) ) ;

wofstream  outfile("bar.dat") ;
outfile.imbue(utf8) ;

// 將 wstr 寬字串的寬字元存入 bar.dat 檔,並在每個寬字元之後加上空格
copy( wstr.begin() , wstr.end() ,
      ostream_iterator<wchar_t,wchar_t>(outfile,L" ") ) ;


以上的 wifstream 與 wofstream 是分別用來處理寬字元的輸入與輸出的
檔案資料串流物件。請留意,輸入檔的資料須存成為  UTF-8 的檔案格式。
以上的方式也可應用在處理寬字元的字串資料串流物件上,這裡就不再重複。




--
===================================================================
*               人生的意義 : 盡責任  負責任                      *
*               人生的目的 : 受報  還願  行善                *
*               人生的價值 : 奉獻  付出                        *
================================================== 聖嚴法師  語 ===

--
發信站 [中央數學  織夢天堂 bbs.math.ncu.edu.tw]
  •FROM [weihan 從 ziyou4.math.ncu.edu.tw 發表]

上一篇 下一篇 同標題 發表文章 文章列表