お世話になっております。
C++を学習中の学生です。
現在ダイヤログベースの住所録アプリケーションを作成中です。
実現したい処理として
リストコントロールに表示されている全てのデータを保存ボタン押下後にファイル入出力させたいのですが、どのように記述すれば実現するでしょうか。
現状は各コントロールのデータを送っているだけなので
【一回目の入力】
No→1
氏名→山田太郎
年齢→32
性別→男性
住所→東京都○○区○○
というデータを送るとテキストファイルには
1 山田太郎 32 男性 東京都○○区○○
と保存され
【二回目の入力】
No→2
氏名→田中恵子
年齢→29
性別→女性
住所→東京都△△区△△
というデータを送ると
2 田中恵子 29 女性 東京都△△区△△
とテキストファイルが上書きされてしまいます。
ご教授のほどよろしくお願いいたします。
C++
1 2//------------------------------------------------------------------------------ 3// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ 4//------------------------------------------------------------------------------ 5class CAboutDlg : public CDialogEx 6{ 7public: 8 CAboutDlg(); 9 10// ダイアログ データ 11 enum { IDD = IDD_ABOUTBOX }; 12 13 protected: 14 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート 15 16// 実装 17protected: 18 DECLARE_MESSAGE_MAP() 19// afx_msg LRESULT OnInitdialog(WPARAM wParam, LPARAM lParam); 20}; 21//------------------------------------------------------------------------------ 22// コンストラクタ 23//----------------------------------------------------------------------------- 24CZyuSyoDlg::CZyuSyoDlg(CWnd* pParent /*=NULL*/) 25 : CDialogEx(CZyuSyoDlg::IDD, pParent) 26{ 27 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 28 29 m_pQueue = NULL; 30 m_pQueue2 = NULL; 31} 32 33 34 35//------------------------------------------------------------------------------ 36// ダイヤログ初期化処理 37//------------------------------------------------------------------------------ 38BOOL CZyuSyoDlg::OnInitDialog() 39{ 40 CDialogEx::OnInitDialog(); 41 42 // "バージョン情報..." メニューをシステム メニューに追加します。 43 44 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 45 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 46 ASSERT(IDM_ABOUTBOX < 0xF000); 47 48 CMenu* pSysMenu = GetSystemMenu(FALSE); 49 if (pSysMenu != NULL) 50 { 51 BOOL bNameValid; 52 CString strAboutMenu; 53 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 54 ASSERT(bNameValid); 55 if (!strAboutMenu.IsEmpty()) 56 { 57 pSysMenu->AppendMenu(MF_SEPARATOR); 58 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 59 } 60 } 61 62 // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 63 // Framework は、この設定を自動的に行います。 64 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 65 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 66 67 // TODO: 初期化をここに追加します。 68 69 make_queue(); 70 71 m_List.InsertColumn(0, "No." , LVCFMT_CENTER, 35); //No列を追加 72 m_List.InsertColumn(1, "性別", LVCFMT_CENTER, 45); //性別列を追加 73 m_List.InsertColumn(2, "名前", LVCFMT_CENTER, 70); //名前列を追加 74 m_List.InsertColumn(3, "年齢", LVCFMT_CENTER, 35); //年齢列を追加 75 m_List.InsertColumn(4, "住所", LVCFMT_LEFT, 200); //住所列を追加 76 77 CEdit* pEditName = (CEdit *)GetDlgItem( IDC_NAME_I ); 78 CEdit* pEditHome = (CEdit *)GetDlgItem( IDC_HOME_I ); 79 CEdit* pEditTosi = (CEdit *)GetDlgItem( IDC_TOSI_I ); 80 81 //エディットボックスに入力できる文字数を設定する 82 pEditName->LimitText(14); 83 pEditHome->LimitText(70); 84 pEditTosi->LimitText(3); 85 86 87 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 88} 89 90//------------------------------------------------------------------------------ 91// キューの生成 92//------------------------------------------------------------------------------ 93void CZyuSyoDlg::make_queue() 94{ 95 struct Queue *que; 96 97 for( int count=0; count<256; count++ ) 98 { 99 //キューの生成 100 if( count == 0 ) 101 { 102 que = (struct Queue*)malloc(sizeof(struct Queue)); // メモリの確保 103 m_pQueue = que; // 先頭をメンバ変数 104 } 105 else 106 { 107 que->next = (struct Queue*)malloc(sizeof(struct Queue)); // ポインタを繋ぐ 108 que = (struct Queue*)que->next; // nextの値をqueに 109 } 110 que->next = NULL; // nextにNULL 111 memset(que, 0, sizeof(struct Queue)); // クリア 112 } 113} 114 115//------------------------------------------------------------------------------ 116// キューの解放 117//------------------------------------------------------------------------------ 118void CZyuSyoDlg::QueClose() 119{ 120 struct Queue *que; 121 que = m_pQueue; 122 while( 1 ) 123 { 124 m_pQueue = (struct Queue*)que->next; 125 free( que ); 126 que = m_pQueue; 127 if( que == NULL ) 128 { 129 break; 130 } 131 } 132} 133 134//------------------------------------------------------------------------------ 135// キューの切り離し 136//------------------------------------------------------------------------------ 137struct Queue* CZyuSyoDlg::QueCut() 138{ 139 struct Queue *head; 140 141 // キューを切り離す(先頭) 142 if( m_pQueue != NULL ) 143 { 144 head = m_pQueue; 145 m_pQueue = (struct Queue*)head->next; //次の先頭 146 } 147 return( head ); 148} 149 150//------------------------------------------------------------------------------ 151// データキューを繋ぐ 152//------------------------------------------------------------------------------ 153void CZyuSyoDlg::QueData(struct Queue *head) 154{ 155 if( m_pQueue2 == NULL ) 156 { 157 m_pQueue2 = head; 158 } 159 else 160 { 161 struct Queue *data; 162 data = m_pQueue2; 163 while( 1 ) 164 { 165 if( data->next == NULL ) 166 { 167 data->next = head; 168 break; 169 } 170 data = (struct Queue*)data->next; 171 } 172 } 173 head->next = NULL; 174 175} 176 177//------------------------------------------------------------------------------ 178// 送信ボタン押下処理 179//------------------------------------------------------------------------------ 180void CZyuSyoDlg::OnBnClickedGo() 181{ 182 struct Queue *head; 183 head = QueCut(); 184 185 //------------// 186 //名前部の取得// 187 //------------// 188 CString strName; 189 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 190 //CString → charへの変換 191 strcpy_s( head->data.name, strName ); 192 193 //------------// 194 //住所部の取得// 195 //------------// 196 CString strHome; 197 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 198 strcpy_s( head->data.home, strHome ); 199 200 //------------// 201 //年齢部の所得// 202 //------------// 203 CString strTosi; 204 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 205 strcpy_s( head->data.tosi, strTosi ); 206 207 //------------// 208 //Noの所得 // 209 //------------// 210 CString strNo; 211 m_Combo.GetLBText(m_Combo.GetCurSel(),strNo); 212 strcpy_s( head->data.no, strNo ); 213 214 //----------------// 215 //性別の取得(男性)// 216 //----------------// 217 CString strType; 218 if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED ) 219 { 220 strType = ("男性"); 221 strcpy_s( head->data.type, strType ); 222 } 223 224 //----------------// 225 //性別の判定(女性)// 226 //----------------// 227 if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED ) 228 { 229 strType = ("女性"); 230 strcpy_s( head->data.type, strType ); 231 } 232 233 //----------------// 234 //リストへ追加 // 235 //----------------// 236 237 // リストコントロール 行の追加 238 int count = m_List.GetItemCount(); 239 m_List.InsertItem(count, strNo); //No行を追加 240 m_List.SetItem(count, 1, LVIF_TEXT, strType, 0, 0, 0, 0); //性別行を追加 241 m_List.SetItem(count, 2, LVIF_TEXT, strName, 0, 0, 0, 0); //名前列を追加 242 m_List.SetItem(count, 3, LVIF_TEXT, strTosi, 0, 0, 0, 0); //年齢行を追加 243 m_List.SetItem(count, 4, LVIF_TEXT, strHome, 0, 0, 0, 0); //住所行 244// CDialog::OnOK(); 245 246 247 QueData(head); 248} 249 250//------------------------------------------------------------------------------ 251// クリアボタン押下処理 252//------------------------------------------------------------------------------ 253void CZyuSyoDlg::OnBnClickedClear() 254{ 255 //エディットボックス内をクリアする 256 CEdit* pEdit = (CEdit *)GetDlgItem( IDC_NAME_I ); 257 CEdit* pEdit1 = (CEdit *)GetDlgItem( IDC_HOME_I ); 258 CEdit* pEdit2 = (CEdit *)GetDlgItem( IDC_TOSI_I ); 259 260 pEdit ->SetWindowText(""); 261 pEdit1->SetWindowText(""); 262 pEdit2->SetWindowText(""); 263 264} 265 266//------------------------------------------------------------------------------ 267// リスト処理 268//------------------------------------------------------------------------------ 269void CZyuSyoDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) 270{ 271 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); 272 // TODO: ここにコントロール通知ハンドラー コードを追加します。 273 274 275 *pResult = 0; 276} 277 278//------------------------------------------------------------------------------ 279// ファイル入出力 280//------------------------------------------------------------------------------ 281void CZyuSyoDlg::OnBnClickedFile() 282{ 283 284 //-------// 285 // No部 // 286 //------// 287 CString strNo; 288 m_Combo.GetLBText(m_Combo.GetCurSel(),strNo); 289 290 //--------// 291 // 名前部 // 292 //--------// 293 CString strName; 294 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 295 296 //--------// 297 // 住所部 // 298 //--------// 299 CString strHome; 300 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 301 302 //--------// 303 // 年齢部 // 304 //--------// 305 CString strTosi; 306 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 307 308 //--------// 309 // 性別部 // 310 //--------// 311 CString strType; 312 if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED ) 313 { 314 strType = ("男性"); 315 316 } 317 if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED ) 318 { 319 strType = ("女性"); 320 321 } 322 323 324 CStdioFile ZyuSyoFile; 325 //テキストファイルを開く 326 ZyuSyoFile.Open("ZyuSyoData.txt",CFile::modeReadWrite | 327 CFile::shareDenyNone | CFile::modeCreate | CFile::modeNoTruncate); 328 329 //テキストファイルに書き込む 330 331 ZyuSyoFile.WriteString( "No:" + strNo + "|" ); 332 ZyuSyoFile.WriteString( "名前:" + strName + "|" ); 333 ZyuSyoFile.WriteString( "年齢:" + strTosi + "|" ); 334 ZyuSyoFile.WriteString( "性別:" + strType + "|" ); 335 ZyuSyoFile.WriteString( "住所:" + strHome + "|" ); 336 337 //テキストファイルを閉じる 338 ZyuSyoFile.Close(); 339 340 341} 342 343//----------------------------------------------------------------------------------------------------------------------------
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/07 02:37
2016/11/07 02:58
2016/11/07 02:59