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

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

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

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

C++

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

Q&A

解決済

2回答

2576閲覧

ファイル入出力について C++

NaokiPooh

総合スコア21

MFC

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

C++

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

0グッド

0クリップ

投稿2016/11/07 01:38

お世話になっております。
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//----------------------------------------------------------------------------------------------------------------------------

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

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

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

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

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

guest

回答2

0

ベストアンサー

あまり詳しく見てませんが、単に上書きされているだけ?
CStdioFileには追記モードというのがないらしいので、自力でファイルポインタを操作する必要があるみたいですね。
以下参考サイト。
http://www.mfc-programming.com/2011/cfile/mfc332.html

投稿2016/11/07 02:21

ttyp03

総合スコア16998

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

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

episteme

2016/11/07 02:37

追加書き込みを諦め、毎回新規作成しコントロール内のデータを全部書くよう方針変更したみたいですよ?
NaokiPooh

2016/11/07 02:58

回答ありがとうございました! 参考サイトにあったSeekToEnd();を使うことによって解消されました! ただ現状ファイル入出力させると 1 山田太郎 32 男性 東京都○○区○○ 2 田中恵子 29 女性 東京都△△区△△ とつながってしまうので、改行させる方法というのはあるのでしょうか? 質問ばかりで申し訳ございませんがよろしくお願いいたします。
episteme

2016/11/07 02:59

末尾に改行コードを書き込めばいいじゃん!
guest

0

List-control内の文字列を全部書かせるからには

ファイルを(書き込み)openする for ( int i = 0; i < List-control内に格納されたアイテムの個数; ++i ) { i番目のアイテムをファイルに書く } ファイルをcloseする

...なんてなコード書かにゃいかんでしょ。

投稿2016/11/07 01:52

episteme

総合スコア16614

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

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

NaokiPooh

2016/11/07 02:07

回答ありがとうございます。 Listcontrolの1番目のアイテムを指定するのはどのような記述をすればよろしいのでしょうか。。。 ご教授のほどよろしくお願いいたします。
NaokiPooh

2016/11/07 02:21

読んでも該当箇所がわからなかったです。。。 申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問