none
CStdioFile::ReadStringで、文字化けの件 RRS feed

  • 質問

  • 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へキャストすればいい?ということでしょうか?
    ヒントをいただけたらうれしいです。

    初歩的なことで申し訳ないですが、どなたか教えてください。
    お願いします。
    2010年3月8日 7:23

回答

  • fedoraccheさん、こんにちは。

    ビルドエラーについてですが、コードに#include <locale.h>を追加してみてください。

    setlocaleについては、こちらのサイトが参考になると思います。
    サンプルコードもありますので、是非、ご確認してください。

    setlocale、_wsetlocale
    http://msdn.microsoft.com/ja-jp/library/x99tb11d(VS.80).aspx

    fopenやfgetsを使用したやり方は、下記外部サイトに分かりやすく説明されていたので、ご紹介しておきます。

    UNICODEをサポートしたプログラムの作成 - UNICODEによるファイル入出力
    http://yamatyuunet.bne.jp/pc/win/unicode/index.htm

    この情報が少しでも参考になれば幸いです。

    その他、アドバイスがありましたら、ご投稿の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    • 回答としてマーク 菊地俊介 2010年4月1日 6:45
    2010年3月12日 7:06

すべての返信

  • fedoraccheさん、こんにちは。

    ビルドエラーについてですが、コードに#include <locale.h>を追加してみてください。

    setlocaleについては、こちらのサイトが参考になると思います。
    サンプルコードもありますので、是非、ご確認してください。

    setlocale、_wsetlocale
    http://msdn.microsoft.com/ja-jp/library/x99tb11d(VS.80).aspx

    fopenやfgetsを使用したやり方は、下記外部サイトに分かりやすく説明されていたので、ご紹介しておきます。

    UNICODEをサポートしたプログラムの作成 - UNICODEによるファイル入出力
    http://yamatyuunet.bne.jp/pc/win/unicode/index.htm

    この情報が少しでも参考になれば幸いです。

    その他、アドバイスがありましたら、ご投稿の程、宜しくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    • 回答としてマーク 菊地俊介 2010年4月1日 6:45
    2010年3月12日 7:06
  • fedoracche さん、こんにちは。フォーラムのご利用ありがとうございます。

    その後いかがでしょうか? 高橋のアドバイスで疑問は解決しましたか?

    誠に勝手ながら、同じ問題で困っている方にも有用な情報と思われたため、高橋の回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!

    2010年4月1日 6:53