トップ回答者
CStdioFile::ReadStringで、文字化けの件

質問
-
VC++(MFC) 3ヶ月目の初心者です。
Visual Studio 2008 pro , 環境 : Vista Home premium
コンボBoxのデータとなる、リストが書かれた(Shift_JIS)ファイル "data.txt"
山田さん
田中さん
山本さん
をCStdioFile::Open で、開いてコンボBoxに表示できたかと思ったら、文字化けしていました。
<ファイルを開くコード部分 (ダイアログボックスの ::OnInitDailog( ... ) )>BOOL CAddDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ここに初期化を追加してください // コンボboxに入れるデータ"data.txt"を読込む TCHAR* pszFileName = L"d:\\data.txt"; CFileException fileException; BOOL ret; CString strLine ; CStringList cStrCombo ; // リスト CStdioFile cFile; ret = cFile.Open( pszFileName , CFile::modeRead | CFile::shareDenyNone , &fileException ); if ( ret == false ) { AfxMessageBox( L"ファイルが読込めません。" ); return 1; } while ( ret ) { ret = cFile.ReadString( strLine ); cStrCombo.AddTail( strLine ); } cFile.Close(); // コンボboxに入れる CComboBoxEx* pCombo = (CComboBoxEx*) GetDlgItem( IDC_COMBOBOXEX1 ); COMBOBOXEXITEM cbi ; cbi.mask = CBEIF_TEXT; for ( POSITION pos = cStrCombo.GetHeadPosition() ; pos != NULL ; ) { int nCount = 0; CString cBuf = cStrCombo.GetNext( pos ); cbi.iItem = nCount; cbi.pszText = (LPTSTR)(LPCTSTR) cBuf ; cbi.cchTextMax = 256; pCombo->InsertItem( &cbi ); nCount++; } return TRUE; // return TRUE unless you set the focus to a control // 例外 : OCX プロパティ ページは必ず FALSE を返します。 }
こちらのページで→ http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/6edc50ca-3dbf-422e-814b-2c16c67c83ec
setlocale(LC_ALL, ".ACP");
が先頭に、要記入、とのアドバイスがありますが、
「先頭」とはどのソースファイルの先頭になるのか?分からず質問をします。
上記のソースファイル AddDialog.cpp の先頭に書いてみたら、↓
#include "stdafx.h"
ビルドで、
#include "DadStockCost01.h"
#include "AddDialog.h"
/* 追記 */
setlocale( LC_ALL , L".ACP");
error C2065: 'LC_ALL' : 定義されていない識別子です。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
error C2078: 初期化子の数が多すぎます。
error C2440: '初期化中' : 'const wchar_t [5]' から 'int' に変換できません。
とエラーがでました。
また、上記のURLページにある
「 CStdioFileを使わず、fopen,fgetsを使って、char型配列に文字列を読み込み、 CStringクラスを使ってUnicodeに変換する場合は、setlocaleは必要ないかもしれません。」
とは、char型からCStringへキャストすればいい?ということでしょうか?
ヒントをいただけたらうれしいです。
初歩的なことで申し訳ないですが、どなたか教えてください。
お願いします。
回答
-
fedoraccheさん、こんにちは。
ビルドエラーについてですが、コードに#include <locale.h>を追加してみてください。
setlocaleについては、こちらのサイトが参考になると思います。
サンプルコードもありますので、是非、ご確認してください。setlocale、_wsetlocale
http://msdn.microsoft.com/ja-jp/library/x99tb11d(VS.80).aspxfopenやfgetsを使用したやり方は、下記外部サイトに分かりやすく説明されていたので、ご紹介しておきます。
UNICODEをサポートしたプログラムの作成 - UNICODEによるファイル入出力
http://yamatyuunet.bne.jp/pc/win/unicode/index.htmこの情報が少しでも参考になれば幸いです。
その他、アドバイスがありましたら、ご投稿の程、宜しくお願いします。
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹- 回答としてマーク 菊地俊介 2010年4月1日 6:45
すべての返信
-
fedoraccheさん、こんにちは。
ビルドエラーについてですが、コードに#include <locale.h>を追加してみてください。
setlocaleについては、こちらのサイトが参考になると思います。
サンプルコードもありますので、是非、ご確認してください。setlocale、_wsetlocale
http://msdn.microsoft.com/ja-jp/library/x99tb11d(VS.80).aspxfopenやfgetsを使用したやり方は、下記外部サイトに分かりやすく説明されていたので、ご紹介しておきます。
UNICODEをサポートしたプログラムの作成 - UNICODEによるファイル入出力
http://yamatyuunet.bne.jp/pc/win/unicode/index.htmこの情報が少しでも参考になれば幸いです。
その他、アドバイスがありましたら、ご投稿の程、宜しくお願いします。
マイクロソフト株式会社 フォーラム オペレーター 高橋春樹- 回答としてマーク 菊地俊介 2010年4月1日 6:45