質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.42%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1331閲覧

CSVファイルから読み込んだ内容をリストコントロールに表示する処理が上手くいかないので、原因や修正方法をご教授願いたいです。

don

総合スコア10

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/08/03 11:43

編集2022/08/03 13:29

実現したいこと

CSVファイルから読み込んだ内容を配列に格納して、リストコントロールに表示させたいです。

今の状態

CSVファイルから配列にデータを格納するところまでは、デバックしてみて確認しました。
ただCSV内の改行箇所でデータの順番がおかしくなってしまっています。
1行目の最後の要素と、2行目の最初の要素がリストコントロールの同じ場所に入力されてしまう。

該当のソースコード

C++

1// CSVファイルからデータを読み込んで、リストコントロールへ入力 2void CBMIviewerDlg::OnBnClickedButton_ReadCSV() 3{ 4 // ファイルパスを参照する処理 5 TCHAR FilePath[256]; 6 CEdit *pFilePath = ( CEdit * ) GetDlgItem( IDC_EDIT6 ); 7 int nLen1 = pFilePath->GetWindowText( FilePath, 256 ); 8 9 FilePath[nLen1] = _T( '\0' ); 10 11 // 参照したファイルの読み取り 12 CStdioFile input; 13 input.Open( FilePath, CFile::modeReadWrite ); 14 int FileSize = input.GetLength(); 15 char chBufRead[1300]; 16 17 input.ReadString( chBufRead, FileSize ); 18 CString strData = chBufRead; 19 20 CArray<CString, CString> arrData; 21 22 int nStart = 0; 23 int nPos = -1; 24 25 int nItem = m_ListCtrl.GetItemCount(); 26 27 CString restoken; 28 nPos = strData.Find( ',', nStart ); 29 30 31 while( -1 < nPos ){ 32 restoken = strData.Mid( nStart, nPos - nStart ); 33 arrData.Add( restoken ); 34 35 nStart = nPos + 1; 36 nPos = strData.Find( ',', nStart ); 37 38 if( -1 == nPos ){ 39 restoken = strData.Mid( nStart ); 40 arrData.Add( restoken ); 41 42 for( int n = 0; n < 10; n++ ){ 43 nItem = m_ListCtrl.InsertItem( nItem, arrData[n * 8], n ); 44 m_ListCtrl.SetItem( nItem, 1, LVIF_TEXT, arrData[n * 8 + 1], n, NULL, NULL, NULL ); 45 m_ListCtrl.SetItem( nItem, 2, LVIF_TEXT, arrData[n * 8 + 2], n, NULL, NULL, NULL ); 46 m_ListCtrl.SetItem( nItem, 3, LVIF_TEXT, arrData[n * 8 + 3], n, NULL, NULL, NULL ); 47 m_ListCtrl.SetItem( nItem, 4, LVIF_TEXT, arrData[n * 8 + 4], n, NULL, NULL, NULL ); 48 m_ListCtrl.SetItem( nItem, 5, LVIF_TEXT, arrData[n * 8 + 5], n, NULL, NULL, NULL ); 49 m_ListCtrl.SetItem( nItem, 6, LVIF_TEXT, arrData[n * 8 + 6], n, NULL, NULL, NULL ); 50 m_ListCtrl.SetItem( nItem, 7, LVIF_TEXT, arrData[n * 8 + 7], n, NULL, NULL, NULL ); 51 52 } 53 } 54 } 55}

補足情報(FW/ツールのバージョンなど)

visual studioのバージョンは2022です。
MFCのダイアログベース、
スタティックライブラリでMFCを使用
マルチバイト文字セット
を利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

nItem = m_ListCtrl.InsertItem( nItem, arrData[n * 8], n );
第一引数がnItemではなくnでは?

【追記】
初回のnItemは最初このリストの全行数か。そうなると追記(行追加)したいのでしょうかね。
nItem = m_ListCtrl.InsertItem( nItem, arrData[n * 8], n );
で、第一引数のnItemは追加する行IndexなのでOK。
戻りのnItemはその追加された行Index値。以降のSetItemのためにはOK。
ただし、ループの2周目のInserItemの第一引数のnItemは不適でしょう。
nItem+nにしないと新規行が追加されない。

また、以降のSetItemの第5引数もそうですが、InsertItemの第3引数のnにしているのは別の話として気になる。

投稿2022/08/04 01:49

編集2022/08/04 02:06
ardin

総合スコア548

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

don

2022/08/04 03:19

度々回答ありがとうございますm(_ _)m 関数の引数に関しては勘違いしておりました。 ご指摘いただいた部分に関して修正してみたところ、一行目まではリストに入力されるのですが2行目以降が何も入力されなくなってしまいました。 おそらく私の元のコードがおかしいのですが、どう修正すれば良いのか悩んでおります汗
ardin

2022/08/04 07:44

ファイル読み込み部分は診てませんでした。 dodox86さんの言う通り、ファイル読み込みが想定通りになされていません。 一気に全行読みだすか、一行一行読んでは表示するようにするかなど、読み込む部分を作成してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問