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

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

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

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

C++

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

Q&A

解決済

2回答

7236閲覧

MFC ファイル入出力に関して

NaokiPooh

総合スコア21

MFC

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

C++

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

0グッド

0クリップ

投稿2016/11/11 04:45

編集2016/11/11 04:46

お世話になっております。
連日質問の連投で申し訳ございません。
C++を学習中の学生です。
現在C++でダイヤログベースの住所録を作成中です。
以下画面
イメージ説明

左画面の各情報を入力後、送信を押下することによってリストに表示させています。(同時にファイル入出力もさせています)
以下テキストファイル中身
イメージ説明

現在上記画面の用にリストを選択すると左側のエディット部にリストの各項目が表示され、内容を変更し、更新押下するとリストが更新されます。
また、リストを選択した状態で削除押下するとリストからその行が削除されます。

なのですが、リスト上でしか更新・削除がされておらず、デバックしなおすとファイルの情報をリストに表示させているため、更新・削除される前のリストが表示されます。

これからしたい処理として、更新・削除を行うときに同時にファイルの中身もそれに伴う処理をさせたいのですが、どのような流れになるでしょうか。。。

ご教授よろしくお願いいたします。

以下ソース

C++

1//------------------------------------------------------------------------------ 2// 送信ボタン押下処理 3//------------------------------------------------------------------------------ 4void CZyuSyoDlg::OnBnClickedGo() 5{ 6 struct Queue *head; 7 head = QueCut(); 8 9 //------------// 10 //名前部の取得// 11 //------------// 12 CString strName; 13 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 14 //CString → charへの変換 15 strcpy_s( head->data.name, strName ); 16 17 //------------// 18 //住所部の取得// 19 //------------// 20 CString strHome; 21 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 22 strcpy_s( head->data.home, strHome ); 23 24 //------------// 25 //年齢部の所得// 26 //------------// 27 CString strTosi; 28 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 29 strcpy_s( head->data.tosi, strTosi ); 30 31 //------------// 32 //Noの所得 // 33 //------------// 34 CString strNo; 35 m_Combo.GetLBText(m_Combo.GetCurSel(),strNo); 36 37 //テキスト用テキストファイル読み込み 38 if( strNo != "" ) 39 { 40 CString strNoData; 41 CStdioFile ZyuSyoFile3("NoData.txt", CFile::modeCreate | CFile::modeNoTruncate | 42 CFile::modeRead | CFile::typeText); 43 //1行ずつ読み込ませる 44 BOOL strRead2; 45 while( 1 ) 46 { 47 strRead2 = ZyuSyoFile3.ReadString( strNoData ); 48 if( strRead2 == FALSE ) 49 { 50 break; 51 } 52 //読み込んだ値と取得した値を比べる 53 m_No = strNoData; 54 if( m_No == strNo ) 55 { 56 MessageBox("Noが重複しています!","†警告†",MB_OK | MB_ICONSTOP); 57 return; 58 } 59 60 } 61 } 62 63 strcpy_s( head->data.no, strNo ); 64 65 //----------------// 66 //性別の取得(男性)// 67 //----------------// 68 CString strType; 69 if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED ) 70 { 71 strType = ("男性"); 72 strcpy_s( head->data.type, strType ); 73 } 74 75 //----------------// 76 //性別の判定(女性)// 77 //----------------// 78 if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED ) 79 { 80 strType = ("女性"); 81 strcpy_s( head->data.type, strType ); 82 } 83 84 85 //----------------// 86 //リストへ追加 // 87 //----------------// 88 // リストコントロール 行の追加 89 int count = m_List.GetItemCount(); 90 m_List.InsertItem(count, strNo); //No行を追加 91 m_List.SetItem(count, 1, LVIF_TEXT, strType, 0, 0, 0, 0); //性別行を追加 92 m_List.SetItem(count, 2, LVIF_TEXT, strName, 0, 0, 0, 0); //名前列を追加 93 m_List.SetItem(count, 3, LVIF_TEXT, strTosi, 0, 0, 0, 0); //年齢行を追加 94 m_List.SetItem(count, 4, LVIF_TEXT, strHome, 0, 0, 0, 0); //住所行 95 96 //----------------// 97 //ファイル入出力 // 98 //----------------// 99 CStdioFile ZyuSyoFile; 100 //テキストファイルを開く 101 ZyuSyoFile.Open("ZyuSyoData.txt",CFile::modeReadWrite | 102 CFile::shareDenyNone | CFile::modeCreate | CFile::modeNoTruncate); 103 104 //テキストファイルの最後に追加していく 105 ZyuSyoFile.SeekToEnd(); 106 107 //各要素をテキストファイルに 108 ZyuSyoFile.WriteString( strNo + "\n" ); 109 ZyuSyoFile.WriteString( strType + "\n" ); 110 ZyuSyoFile.WriteString( strName + "\n" ); 111 ZyuSyoFile.WriteString( strTosi + "\n" ); 112 ZyuSyoFile.WriteString( strHome + "\n" ); 113 114 //テキストファイルを閉じる 115 ZyuSyoFile.Close(); 116 117 //No用テキストファイル作成 118 CStdioFile ZyuSyoFile2; 119 ZyuSyoFile2.Open("NoData.txt",CFile::modeReadWrite | 120 CFile::shareDenyNone | CFile::modeCreate | CFile::modeNoTruncate); 121 ZyuSyoFile2.SeekToEnd(); 122 ZyuSyoFile2.WriteString( strNo + "\n" ); 123 ZyuSyoFile2.Close(); 124 125 QueData(head); 126} 127//------------------------------------------------------------------------------ 128// 更新ボタン 129//------------------------------------------------------------------------------ 130void CZyuSyoDlg::OnBnClickedHenB() 131{ 132 POSITION pos; 133 while( 1 ) 134 { 135 pos = m_List.GetFirstSelectedItemPosition(); 136 if(!pos) 137 { 138 break; 139 } 140 int nItem = m_List.GetNextSelectedItem(pos); 141 CString strName; 142 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 143 CString strHome; 144 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 145 CString strTosi; 146 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 147 148 m_List.SetItem(nItem, 2, LVIF_TEXT, strName, 0, 0, 0, 0); 149 m_List.SetItem(nItem, 3, LVIF_TEXT, strTosi, 0, 0, 0, 0); 150 m_List.SetItem(nItem, 4, LVIF_TEXT, strHome, 0, 0, 0, 0); 151 break; 152 } 153} 154 155 156//------------------------------------------------------------------------------ 157// 削除ボタン 158//------------------------------------------------------------------------------ 159void CZyuSyoDlg::OnBnClickedDelB() 160{ 161 POSITION pos; 162 while( 1 ) 163 { 164 pos = m_List.GetFirstSelectedItemPosition(); 165 if(!pos) 166 { 167 break; 168 } 169 int nItem = m_List.GetNextSelectedItem(pos); 170 m_List.DeleteItem(nItem); 171 } 172 173 174}

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

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

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

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

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

guest

回答2

0

ベストアンサー

ファイルを削除して作り直すという手は?(上書きでもいけるかな?)
リスト削除でも追加でもリストを元に作り直す
こうすれば、ファイル作成処理が一つで済む

投稿2016/11/11 05:37

編集2016/11/11 05:38
ardin

総合スコア544

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

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

0

[save]と[load]のボタンを用意し、[save]が押されたらListをファイルへ/[load]が押されたらファイルからListへ。
...ってなこと、できますか?

できればあとは簡単、アプリが立ち上がったときに[load]/終了直前に[save] が押された時の処理をすればいい。

投稿2016/11/11 05:22

episteme

総合スコア16614

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

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

NaokiPooh

2016/11/11 07:05

回答ありがとうございます! アドバイスを参考に現在修正をかけております。 セーブ押下後にリストの中身をテキストファイルに送り(再作成)、ロード押下後ファイルの中身をリストに表示させるという処理を作ろうと模索中なのですが、リストからテキストファイルに送る場合はどういう処理をさせればいいでしょうのか。 だんだん頭が混乱してまいりましたorz
NaokiPooh

2016/11/11 07:25

上記の場合は各コントロールの情報を文字列にしてファイル入出力させておりました。 現状わからない所はリストコントロール内のデータをどのようにすればファイル入出力できかということです! 上の画面画像で言うとどう処理させれば1~秋田県秋田市までの情報をテキストファイルに送れますでしょうか。
episteme

2016/11/11 07:32

わけわからんです。"リストを選択すると左側のエディット部にリストの各項目が表示"できてんでしょ? なのになぜできんのですか?
NaokiPooh

2016/11/11 07:39

あ。。。なるほど。。。頭が固すぎました。。。 もう少しがんばって見ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問