- ベストアンサー
テキストファイルの各行の文字列をコンボBoxに表示させる方法
- VC++ MFCでテキストファイルから各行の文字列をコンボBoxに表示させる方法について質問があります。
- 現在VC++ MFCの勉強をしており、テキストファイルから一行ずつ読み込んでコンボBoxに表示したいと考えています。
- しかし、特定の箇所でビルドエラーが発生しており、解決方法がわかりません。お手数ですが、ご教示いただけますと幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>コンボボックスに入れるときは >CComboBoxExの親クラスのCComboBoxのメンバ関数が使えるので、 >文字列を格納するだけであれば、AddStringやInsertStringで十分ではないでしょうか。 は使えないようですね。ASSERT(FALSE);がモロ書いてありました。 fgetsをつかった場合はこんな感じ ※インデントの全角空白を使っています。コピペは注意してください。 TCHAR* pszFileName = _T("d:\\data.txt"); CStringArray cStrComboArr ; #if 0 setlocale(LC_ALL, ".ACP"); TRY { CStdioFile cFile(pszFileName , CFile::modeRead | CFile::shareDenyNone); CString strLine; while (cFile.ReadString(strLine)) { cStrComboArr.Add(strLine); } cFile.Close(); } CATCH (CFileException, e) { AfxMessageBox(_T("ファイルの読み込み失敗!")); } END_CATCH #else FILE* fp = NULL; if (_tfopen_s(&fp, pszFileName, _T("r")) != 0) { AfxMessageBox(_T("ファイルのオープン失敗!")); } char szLine[256]; while (fgets(szLine, _countof(szLine), fp) != NULL) { cStrComboArr.Add(CString(szLine)); } if (fclose(fp) != 0) { AfxMessageBox(_T("ファイルのクローズ失敗!")); } #endif CComboBoxEx* pComboBox = (CComboBoxEx*)this->GetDlgItem(IDC_COMBOBOXEX1); COMBOBOXEXITEM cbi = {0}; cbi.mask = CBEIF_TEXT; for (INT_PTR i = 0; i < cStrComboArr.GetCount(); ++i, ++cbi.iItem) { cbi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(cStrComboArr[i])); cbi.cchTextMax = cStrComboArr[i].GetLength(); pComboBox->InsertItem(&cbi); }
その他の回答 (2)
- bluecampus
- ベストアンサー率66% (138/209)
setlocaleは関数内で書かないとだめです。 #include <xxxx.h> setlocale(LC_ALL, ".ACP"); とかいても当然エラーです。 読み込む直前で書いてもよいのですが、 ・何度も読み込むことがある ・setlocaleを固定してしまって問題ない(場合によって切り分ける必要がない) のであれば、CXXXAppクラスのInitInstanceメソッドに記述すればいいです。 場所は >SetRegistryKey と記述がある次の行あたりで。 ちなみにMSDN フォーラムの蒼の洞窟は私です。 >「 CStdioFileを使わず、fopen,fgetsを使って、char型配列に文字列を読み込み、 CStringクラスを使ってUnicodeに変換する場合は、setlocaleは必要ないかもしれません。」 とは、char型からCStringへキャストすればいい?ということでしょうか? ヒントをいただけたらうれしいです。 については、キャストというわけではなくCStringのコンストラクタを使って変換するということです。
お礼
>ちなみにMSDN フォーラムの蒼の洞窟は私です。 そうでしたか。世間は狭いですね。 >については、キャストというわけではなくCStringのコンストラクタを使って変換するということです。 私は、このことがピンと来ないということは、もっと基礎からやり直さないといけません。
- bluecampus
- ベストアンサー率66% (138/209)
まず、CFile::Readでは1行ごとに読み込めません。 CStdioFileクラスのReadStringをつかうとCString型でやり取りできます。 (setlocaleが必要) http://msdn.microsoft.com/ja-jp/library/x5t0zfyf%28VS.80%29.aspx >cStrComboArr.Add( buffLine ); の部分でエラー表示は、 >「INT_PTR CStringArray::Add(LPCTSTR)' : 1 番目の引数を 'char [256]' から 'LPCTSTR' に変換できません。」です。 CStringのコンストラクタを使ってみては。 ただし、buffLine が'\0'で終端しているという保証はないでしょうけど。 コンボボックスに入れるときは CComboBoxExの親クラスのCComboBoxのメンバ関数が使えるので、 文字列を格納するだけであれば、AddStringやInsertStringで十分ではないでしょうか。
お礼
bluecampusさん ご回答ありがとうございます。 >まず、CFile::Readでは1行ごとに読み込めません。 >CStdioFileクラスのReadStringをつかうとCString型でやり取りできます。 実は、CFileを使う前、CStdioFileを試していましたが、 「Unicode 文字セットを使用する」を設定している為、文字化けしていました。 >(setlocaleが必要) とは、どのソースファイルのどの位置に書けばいいのか アドバイスいただけないでしょうか。 msdn > forum > VC++ で同じような質問をしたのですが、 どなたからも回答頂けませんでしたので、okwaveにきました。 宜しくお願いします。
お礼
> while (fgets(szLine, _countof(szLine), fp) != NULL) { > cStrComboArr.Add(CString(szLine)); > } CStringのコンストラクタを使うとはこのことだったのですね。 こんなに細かく書いて頂いて、ホントに感謝です。 しかし、 > for (INT_PTR i = 0; i < cStrComboArr.GetCount(); ++i, ++cbi.iItem) > { > cbi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(cStrComboArr[i])); > cbi.cchTextMax = cStrComboArr[i].GetLength(); > pComboBox->InsertItem(&cbi); > } この箇所の手法は、今の私には未だ理解するのに時間がかかりそうです。。
補足
素晴しい! 成功しました。 bluecampusさんのおかげでした。 今後、自分で解決できるよう、基礎に戻って習得していきたいと思います。 また質問すると思いますが、brosisを見かけたら宜しくお願いします。