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

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

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

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

C++

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

Q&A

2回答

4703閲覧

C++ CFileについて

NaokiPooh

総合スコア21

MFC

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

C++

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

0グッド

0クリップ

投稿2016/11/04 04:36

お世話になっております。
C++を学習中の学生です。
今現在ダイヤログベースで住所録を作成しております。MFCです。

これから実装したい機能として
・保存ボタン押下後、ファイル入出力させたい。
・テキストファイルには、各コントロールのデータを送りたい。
・テキストファイルに送られてきたデータを一覧で見れるようにしたい。

現状の不具合
・保存押下後、各コントロールのデータを送れるが、二回目以降にデータを送ると上書きされてしまう。
例:
【一回目の入力】
No→1
氏名→山田太郎
年齢→32
性別→男性
住所→東京都○○区○○
というデータを送るとテキストファイルには

1 山田太郎 32 男性 東京都○○区○○

と保存され
【二回目の入力】
No→2
氏名→田中恵子
年齢→29
性別→女性
住所→東京都△△区△△
というデータを送ると

2 田中恵子 29 女性 東京都△△区△△

と保存されてしまいます。
これを

1 山田太郎 32 男性 東京都○○区○○
2 田中恵子 29 女性 東京都△△区△△

のように保存させるのはどのように記述しなおせばよいかご教授お願い致します。

C++

1//------------------------------------------------------------------------------ 2// ダイヤログ初期化処理 3//------------------------------------------------------------------------------ 4BOOL CZyuSyoDlg::OnInitDialog() 5{ 6 CDialogEx::OnInitDialog(); 7 8 // "バージョン情報..." メニューをシステム メニューに追加します。 9 10 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 11 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 12 ASSERT(IDM_ABOUTBOX < 0xF000); 13 14 CMenu* pSysMenu = GetSystemMenu(FALSE); 15 if (pSysMenu != NULL) 16 { 17 BOOL bNameValid; 18 CString strAboutMenu; 19 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 20 ASSERT(bNameValid); 21 if (!strAboutMenu.IsEmpty()) 22 { 23 pSysMenu->AppendMenu(MF_SEPARATOR); 24 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 25 } 26 } 27 28 // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 29 // Framework は、この設定を自動的に行います。 30 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 31 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 32 33 // TODO: 初期化をここに追加します。 34 35 make_queue(); 36 37 m_List.InsertColumn(0, "No." , LVCFMT_CENTER, 35); //No列を追加 38 m_List.InsertColumn(1, "性別", LVCFMT_CENTER, 45); //性別列を追加 39 m_List.InsertColumn(2, "名前", LVCFMT_CENTER, 70); //名前列を追加 40 m_List.InsertColumn(3, "年齢", LVCFMT_CENTER, 35); //年齢列を追加 41 m_List.InsertColumn(4, "住所", LVCFMT_LEFT, 200); //住所列を追加 42 43 CEdit* pEditName = (CEdit *)GetDlgItem( IDC_NAME_I ); 44 CEdit* pEditHome = (CEdit *)GetDlgItem( IDC_HOME_I ); 45 CEdit* pEditTosi = (CEdit *)GetDlgItem( IDC_TOSI_I ); 46 47 //エディットボックスに入力できる文字数を設定する 48 pEditName->LimitText(14); 49 pEditHome->LimitText(70); 50 pEditTosi->LimitText(3); 51 52 53 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 54} 55//------------------------------------------------------------------------------ 56// キューの生成 57//------------------------------------------------------------------------------ 58void CZyuSyoDlg::make_queue() 59{ 60 struct Queue *que; 61 62 for( int count=0; count<256; count++ ) 63 { 64 //キューの生成 65 if( count == 0 ) 66 { 67 que = (struct Queue*)malloc(sizeof(struct Queue)); // メモリの確保 68 m_pQueue = que; // 先頭をメンバ変数 69 } 70 else 71 { 72 que->next = (struct Queue*)malloc(sizeof(struct Queue)); // ポインタを繋ぐ 73 que = (struct Queue*)que->next; // nextの値をqueに 74 } 75 que->next = NULL; // nextにNULL 76 memset(que, 0, sizeof(struct Queue)); // クリア 77 } 78} 79 80//------------------------------------------------------------------------------ 81// キューの解放 82//------------------------------------------------------------------------------ 83void CZyuSyoDlg::QueClose() 84{ 85 struct Queue *que; 86 que = m_pQueue; 87 while( 1 ) 88 { 89 m_pQueue = (struct Queue*)que->next; 90 free( que ); 91 que = m_pQueue; 92 if( que == NULL ) 93 { 94 break; 95 } 96 } 97} 98 99//------------------------------------------------------------------------------ 100// キューの切り離し 101//------------------------------------------------------------------------------ 102struct Queue* CZyuSyoDlg::QueCut() 103{ 104 struct Queue *head; 105 106 // キューを切り離す(先頭) 107 if( m_pQueue != NULL ) 108 { 109 head = m_pQueue; 110 m_pQueue = (struct Queue*)head->next; //次の先頭 111 } 112 return( head ); 113} 114 115//------------------------------------------------------------------------------ 116// データキューを繋ぐ 117//------------------------------------------------------------------------------ 118void CZyuSyoDlg::QueData(struct Queue *head) 119{ 120 if( m_pQueue2 == NULL ) 121 { 122 m_pQueue2 = head; 123 } 124 else 125 { 126 struct Queue *data; 127 data = m_pQueue2; 128 while( 1 ) 129 { 130 if( data->next == NULL ) 131 { 132 data->next = head; 133 break; 134 } 135 data = (struct Queue*)data->next; 136 } 137 } 138 head->next = NULL; 139 140} 141 142//------------------------------------------------------------------------------ 143// 送信ボタン押下処理 144//------------------------------------------------------------------------------ 145void CZyuSyoDlg::OnBnClickedGo() 146{ 147 struct Queue *head; 148 head = QueCut(); 149 150 //------------// 151 //名前部の取得// 152 //------------// 153 CString strName; 154 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 155 //CString → charへの変換 156 strcpy_s( head->data.name, strName ); 157 158 //------------// 159 //住所部の取得// 160 //------------// 161 CString strHome; 162 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 163 strcpy_s( head->data.home, strHome ); 164 165 //------------// 166 //年齢部の所得// 167 //------------// 168 CString strTosi; 169 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 170 strcpy_s( head->data.tosi, strTosi ); 171 172 //------------// 173 //Noの所得 // 174 //------------// 175 CString strNo; 176 m_Combo.GetLBText(m_Combo.GetCurSel(),strNo); 177 strcpy_s( head->data.no, strNo ); 178 179 //----------------// 180 //性別の取得(男性)// 181 //----------------// 182 CString strType; 183 if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED ) 184 { 185 strType = ("男性"); 186 strcpy_s( head->data.type, strType ); 187 } 188 189 //----------------// 190 //性別の判定(女性)// 191 //----------------// 192 if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED ) 193 { 194 strType = ("女性"); 195 strcpy_s( head->data.type, strType ); 196 } 197 198 //----------------// 199 //リストへ追加 // 200 //----------------// 201 202 // リストコントロール 行の追加 203 int count = m_List.GetItemCount(); 204 m_List.InsertItem(count, strNo); //No行を追加 205 m_List.SetItem(count, 1, LVIF_TEXT, strType, 0, 0, 0, 0); //性別行を追加 206 m_List.SetItem(count, 2, LVIF_TEXT, strName, 0, 0, 0, 0); //名前列を追加 207 m_List.SetItem(count, 3, LVIF_TEXT, strTosi, 0, 0, 0, 0); //年齢行を追加 208 m_List.SetItem(count, 4, LVIF_TEXT, strHome, 0, 0, 0, 0); //住所行 209// CDialog::OnOK(); 210 211 212 QueData(head); 213} 214//------------------------------------------------------------------------------ 215// クリアボタン押下処理 216//------------------------------------------------------------------------------ 217void CZyuSyoDlg::OnBnClickedClear() 218{ 219 //エディットボックス内をクリアする 220 CEdit* pEdit = (CEdit *)GetDlgItem( IDC_NAME_I ); 221 CEdit* pEdit1 = (CEdit *)GetDlgItem( IDC_HOME_I ); 222 CEdit* pEdit2 = (CEdit *)GetDlgItem( IDC_TOSI_I ); 223 224 pEdit ->SetWindowText(""); 225 pEdit1->SetWindowText(""); 226 pEdit2->SetWindowText(""); 227 228} 229 230//------------------------------------------------------------------------------ 231// ファイル入出力 232//------------------------------------------------------------------------------ 233void CZyuSyoDlg::OnBnClickedFile() 234{ 235 //-------// 236 // No部 // 237 //------// 238 CString strNo; 239 m_Combo.GetLBText(m_Combo.GetCurSel(),strNo); 240 //--------// 241 // 名前部 // 242 //--------// 243 CString strName; 244 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 245 //--------// 246 // 住所部 // 247 //--------// 248 CString strHome; 249 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 250 //--------// 251 // 年齢部 // 252 //--------// 253 CString strTosi; 254 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 255 //--------// 256 // 性別部 // 257 //--------// 258 CString strType; 259 if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED ) 260 { 261 strType = ("男性"); 262 } 263 if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED ) 264 { 265 strType = ("女性"); 266 } 267 268 269 CStdioFile ZyuSyoFile; 270 //テキストファイルを開く 271 ZyuSyoFile.Open("ZyuSyoData.txt",CFile::modeReadWrite | 272 CFile::shareExclusive | CFile::modeCreate); 273 274 //テキストファイルに書き込む 275 ZyuSyoFile.WriteString(strNo); 276 ZyuSyoFile.WriteString(strName); 277 ZyuSyoFile.WriteString(strHome); 278 ZyuSyoFile.WriteString(strType); 279 ZyuSyoFile.WriteString(strTosi); 280 281 //テキストファイルを閉じる 282 ZyuSyoFile.Close(); 283}

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

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

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

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

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

guest

回答2

0

CFileのOpenメソッドのオプションフラグの指定はmodeCreate | modeNoTruncateにしておかないと、既にファイルが有る場合破棄されてしまいます。
MFCファイル入出力の基本

投稿2016/11/04 07:58

PineMatsu

総合スコア3579

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

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

0

CStdioFile ZyuSyoFile; //テキストファイルを開く ZyuSyoFile.Open("ZyuSyoData.txt",CFile::modeReadWrite | CFile::shareExclusive | CFile::modeCreate);

modeCreateだとファイルを毎回新規作成するハズ。マニュアル読みなさい。

投稿2016/11/04 04:42

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問