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

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

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

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

C++

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

Q&A

3回答

3380閲覧

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

NaokiPooh

総合スコア21

MFC

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

C++

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

0グッド

0クリップ

投稿2016/11/02 00:35

編集2016/11/02 00:42

お世話になっております。
C++を学習中の学生です。
現在住所録の課題を行っております。
【現在実装したこと】
・データ管理はキュー構造
・送信ボタン押下後リストに表示させる
・クリアボタン押下後エディット部をクリア
【実装したいこと】
・各エディット、チェックボックス、コンボボックスのデータをファイル入出力させたい

上記の実装を可能にするにはどのような記述をすればよろしいのでしょうか。
ご教授のほどよろしくお願いいたします。

以下ソース

C++

1 2// ZyuSyoDlg.cpp : 実装ファイル 3// 4 5#include "stdafx.h" 6#include "ZyuSyo.h" 7#include "ZyuSyoDlg.h" 8#include "afxdialogex.h" 9 10#include <iostream> 11#include <fstream> 12#include <string> 13#include <cstdlib> 14 15#ifdef _DEBUG 16#define new DEBUG_NEW 17#endif 18 19//------------------------------------------------------------------------------ 20// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ 21//------------------------------------------------------------------------------ 22class CAboutDlg : public CDialogEx 23{ 24public: 25 CAboutDlg(); 26 27// ダイアログ データ 28 enum { IDD = IDD_ABOUTBOX }; 29 30 protected: 31 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート 32 33// 実装 34protected: 35 DECLARE_MESSAGE_MAP() 36// afx_msg LRESULT OnInitdialog(WPARAM wParam, LPARAM lParam); 37}; 38 39//------------------------------------------------------------------------------ 40// コンストラクタ 41//----------------------------------------------------------------------------- 42CZyuSyoDlg::CZyuSyoDlg(CWnd* pParent /*=NULL*/) 43 : CDialogEx(CZyuSyoDlg::IDD, pParent) 44{ 45 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 46 47 m_pQueue = NULL; 48 m_pQueue2 = NULL; 49} 50 51//------------------------------------------------------------------------------ 52// DDV/DDXサポート 53//------------------------------------------------------------------------------ 54void CZyuSyoDlg::DoDataExchange(CDataExchange* pDX) 55{ 56 CDialogEx::DoDataExchange(pDX); 57 DDX_Control(pDX, IDC_LIST1, m_List); 58 DDX_Control(pDX, IDC_COMBO_NO, m_Combo); 59} 60BEGIN_MESSAGE_MAP(CZyuSyoDlg, CDialogEx) 61 ON_WM_SYSCOMMAND() 62 ON_WM_PAINT() 63 ON_WM_QUERYDRAGICON() 64 65 ON_BN_CLICKED(IDC_GO, &CZyuSyoDlg::OnBnClickedGo) 66 ON_BN_CLICKED(IDC_CLEAR, &CZyuSyoDlg::OnBnClickedClear) 67 ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CZyuSyoDlg::OnLvnItemchangedList1) 68 ON_BN_CLICKED(IDC_FILE, &CZyuSyoDlg::OnBnClickedFile) 69END_MESSAGE_MAP() 70 71 72//------------------------------------------------------------------------------ 73// ダイヤログ初期化処理 74//------------------------------------------------------------------------------ 75BOOL CZyuSyoDlg::OnInitDialog() 76{ 77 CDialogEx::OnInitDialog(); 78 79 // "バージョン情報..." メニューをシステム メニューに追加します。 80 81 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 82 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 83 ASSERT(IDM_ABOUTBOX < 0xF000); 84 85 CMenu* pSysMenu = GetSystemMenu(FALSE); 86 if (pSysMenu != NULL) 87 { 88 BOOL bNameValid; 89 CString strAboutMenu; 90 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 91 ASSERT(bNameValid); 92 if (!strAboutMenu.IsEmpty()) 93 { 94 pSysMenu->AppendMenu(MF_SEPARATOR); 95 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 96 } 97 } 98 99 // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 100 // Framework は、この設定を自動的に行います。 101 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 102 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 103 104 // TODO: 初期化をここに追加します。 105 106 make_queue(); 107 108 m_List.InsertColumn(0, "No." , LVCFMT_CENTER, 35); //No列を追加 109 m_List.InsertColumn(1, "性別", LVCFMT_CENTER, 45); //性別列を追加 110 m_List.InsertColumn(2, "住所", LVCFMT_LEFT, 200); //住所列を追加 111 112 return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 113} 114 115//------------------------------------------------------------------------------ 116// 117//------------------------------------------------------------------------------ 118void CZyuSyoDlg::OnSysCommand(UINT nID, LPARAM lParam) 119{ 120 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 121 { 122 CAboutDlg dlgAbout; 123 dlgAbout.DoModal(); 124 } 125 else 126 { 127 CDialogEx::OnSysCommand(nID, lParam); 128 } 129} 130 131//------------------------------------------------------------------------------ 132// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための 133// 下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、 134// これは、Framework によって自動的に設定されます。 135//------------------------------------------------------------------------------ 136void CZyuSyoDlg::OnPaint() 137{ 138 if (IsIconic()) 139 { 140 CPaintDC dc(this); // 描画のデバイス コンテキスト 141 142 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 143 144 // クライアントの四角形領域内の中央 145 int cxIcon = GetSystemMetrics(SM_CXICON); 146 int cyIcon = GetSystemMetrics(SM_CYICON); 147 CRect rect; 148 GetClientRect(&rect); 149 int x = (rect.Width() - cxIcon + 1) / 2; 150 int y = (rect.Height() - cyIcon + 1) / 2; 151 152 // アイコンの描画 153 dc.DrawIcon(x, y, m_hIcon); 154 } 155 else 156 { 157 CDialogEx::OnPaint(); 158 } 159} 160 161// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、 162// システムがこの関数を呼び出します。 163HCURSOR CZyuSyoDlg::OnQueryDragIcon() 164{ 165 return static_cast<HCURSOR>(m_hIcon); 166} 167//---------------------------------------------------------------------------------------------------------------------------- 168 169 170//------------------------------------------------------------------------------ 171// キューの生成 172//------------------------------------------------------------------------------ 173void CZyuSyoDlg::make_queue() 174{ 175 struct Queue *que; 176 177 for( int count=0; count<256; count++ ) 178 { 179 //キューの生成 180 if( count == 0 ) 181 { 182 que = (struct Queue*)malloc(sizeof(struct Queue)); // メモリの確保 183 m_pQueue = que; // 先頭をメンバ変数 184 } 185 else 186 { 187 que->next = (struct Queue*)malloc(sizeof(struct Queue)); // ポインタを繋ぐ 188 que = (struct Queue*)que->next; // nextの値をqueに 189 } 190 que->next = NULL; // nextにNULL 191 memset(que, 0, sizeof(struct Queue)); // クリア 192 } 193} 194 195//------------------------------------------------------------------------------ 196// キューの解放 197//------------------------------------------------------------------------------ 198void CZyuSyoDlg::QueClose() 199{ 200 struct Queue *que; 201 que = m_pQueue; 202 while( 1 ) 203 { 204 m_pQueue = (struct Queue*)que->next; 205 free( que ); 206 que = m_pQueue; 207 if( que == NULL ) 208 { 209 break; 210 } 211 } 212} 213 214//------------------------------------------------------------------------------ 215// キューの切り離し 216//------------------------------------------------------------------------------ 217struct Queue* CZyuSyoDlg::QueCut() 218{ 219 struct Queue *head; 220 221 // キューを切り離す(先頭) 222 if( m_pQueue != NULL ) 223 { 224 head = m_pQueue; 225 m_pQueue = (struct Queue*)head->next; //次の先頭 226 } 227 return( head ); 228} 229 230//------------------------------------------------------------------------------ 231// データキューを繋ぐ 232//------------------------------------------------------------------------------ 233void CZyuSyoDlg::QueData(struct Queue *head) 234{ 235 if( m_pQueue2 == NULL ) 236 { 237 m_pQueue2 = head; 238 } 239 else 240 { 241 struct Queue *data; 242 data = m_pQueue2; 243 while( 1 ) 244 { 245 if( data->next == NULL ) 246 { 247 data->next = head; 248 break; 249 } 250 data = (struct Queue*)data->next; 251 } 252 } 253 head->next = NULL; 254 255 256} 257 258//------------------------------------------------------------------------------ 259// 送信ボタン押下処理 260//------------------------------------------------------------------------------ 261void CZyuSyoDlg::OnBnClickedGo() 262{ 263 struct Queue *head; 264 head = QueCut(); 265 266 //------------// 267 //名前部の取得// 268 //------------// 269 CString strName; 270 ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName ); 271 //CString → charへの変換 272 strcpy_s( head->data.name, strName ); 273 274 //------------// 275 //住所部の取得// 276 //------------// 277 CString strHome; 278 ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome ); 279 strcpy_s( head->data.home, strHome ); 280 281 //------------// 282 //年齢部の所得// 283 //------------// 284 CString strTosi; 285 ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi ); 286 strcpy_s( head->data.tosi, strTosi ); 287 288 //------------// 289 //Noの所得 // 290 //------------// 291 CString strNo; 292 m_Combo.GetLBText(m_Combo.GetCurSel(),strNo); 293 strcpy_s( head->data.no, strNo ); 294 295 //----------------// 296 //性別の取得(男性)// 297 //----------------// 298 CString strType; 299 if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED ) 300 { 301 strType = ("男性"); 302 strcpy_s( head->data.type, strType ); 303 } 304 305 //----------------// 306 //性別の判定(女性)// 307 //----------------// 308 if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED ) 309 { 310 strType = ("女性"); 311 strcpy_s( head->data.type, strType ); 312 } 313 314 //----------------// 315 //リストへ追加 // 316 //----------------// 317 318 // リストコントロール 行の追加 319 int count = m_List.GetItemCount(); 320 m_List.InsertItem(count, strNo); 321 m_List.SetItem(count, 1, LVIF_TEXT, strType, 0, 0, 0, 0); 322 m_List.SetItem(count, 2, LVIF_TEXT, strHome, 0, 0, 0, 0); 323// CDialog::OnOK(); 324 325 326 QueData(head); 327} 328 329//------------------------------------------------------------------------------ 330// クリアボタン押下処理 331//------------------------------------------------------------------------------ 332void CZyuSyoDlg::OnBnClickedClear() 333{ 334 //エディットボックス内をクリアする 335 CEdit* pEdit = (CEdit *)GetDlgItem( IDC_NAME_I ); 336 CEdit* pEdit1 = (CEdit *)GetDlgItem( IDC_HOME_I ); 337 CEdit* pEdit2 = (CEdit *)GetDlgItem( IDC_TOSI_I ); 338 339 pEdit ->SetWindowText(""); 340 pEdit1->SetWindowText(""); 341 pEdit2->SetWindowText(""); 342 343} 344 345//------------------------------------------------------------------------------ 346// ファイル入出力 347//------------------------------------------------------------------------------ 348void CZyuSyoDlg::OnBnClickedFile() 349{ 350} 351 352//----------------------------------------------------------------------------------------------------------------------------

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

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

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

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

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

guest

回答3

0

MFCでダイアログボックス内のコントロールの制御はDDXの機構を使ったほうが楽だしMFCらしくなります。
ダイアログエディターで、コントロールを右クリックし、変数の定義(だったかな?)を選択して設定すれば、クラス変数としての定義を組み込んでくれます。
詳しくは下記URL参照ください。
DDXの基本1
DDXの基本2

投稿2016/11/02 07:59

PineMatsu

総合スコア3579

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

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

0

何がわからんのかわからん。

ファイルの入出力は Cなら、

ファイルを開く -> 書き込む or 読み込む -> ファイルを閉じる

で可能です。

C++ なら ifstream とか ofstream とかで可能ですし。

読み込み・書き込みはできるが、どういうパターンで保存すべきなのかがわからないってことでしょうか。
それとも別の問題?

これってC++ ってなっていますが、
MFC? WindowsAPI? 別の?

Windows API 実装なら、私なら iniファイルでやりますね。

あるいは、

テキストファイル ( バイナリファイルでもいいが。 ) に、

コントロールID: データ

のようにして、

読み込み時は、

"コントロールID:" にあたる部分は削除( 読み込まない ) して,

そのコントロールID 別に入れていく。

例:

ID_COMBO1
ID_COMBO2
ID_LIST1

とあった場合、


ID_COMBO1: C++
ID_COMBO1: Java
ID_COMBO1: Python
ID_COMBO1: Ruby
ID_COMBO1: Perl
ID_COMBO1: JavaScript
ID_COMBO2: for
ID_COMBO2: if
ID_COMBO2: while
ID_COMBO2: swich...case
ID_LIST1: string
ID_LIST1: int
ID_LIST1: long
...


という風にあったとして、

"ID_COMBO1: " を含んでいる行なら Combobox1 に入れて、
"ID_COMBO2: " を含んでいる行なら Combobox2 に入れて...

という風に。

( コロン(:) + 半角スペース までのデータは省いて。 )

投稿2016/11/02 02:48

BeatStar

総合スコア4958

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

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

NaokiPooh

2016/11/02 03:00

回答ありがとうございます! C++でMFCです。
BeatStar

2016/11/02 03:02

MFCで、何がわからないのでしょうか。 ファイルの読み込みや書き込み方法? どいう風にコントロール別に記録するか?
NaokiPooh

2016/11/02 04:07

まさにその通りでして、読み込みと書き込み方法とコントロール別の記録方法が分からず質問させていただいた次第です。 まだ開発を始めて数ヶ月で理解が追いついていない状況です。
BeatStar

2016/11/02 05:01

ファイルの書き込み・読み込みは、 C++ 入門 等で検索して、その"ファイルの入出力" 関連の項目を読めばいいです。 ifstream というクラスは、ファイル読み込み、 ofstream というクラスは ファイル書き込み らしいです。 ( ごっちゃになったりするので。) コントロール別は、 コントロールID + ":" + データ みたいにして、 回答のやつみたいに、 ID_COMBO1: test ID_COMBO1: make ... という感じで、 "ID_COMBO1: " とあれば、Combobox1 に... みたいに。 そのままだと、 "ID_COMBO1: test", "ID_COMBO1: make", ... とそのままになってしまいますので、 コントロールID と ":" の部分までは省き、 データのみを抽出してコントロールにセット。 まずは、読み込み・書き込みができないといけないので、 「C++ ファイル入出力」や、「C++ 入門」で検索。
guest

0

各エディット、チェックボックス、コンボボックスのデータをファイル入出力させたい

上記の実装を可能にするにはどのような記述をすればよろしいのでしょうか。

  1. ファイルを(書き込み)オープンする
  2. 各コントロールのナカミをファイルに書く
  3. ファイルを閉じる

ですが、何がわからんですか?
それぞれたとえばfopen/fwrite(or fprintf)/fclose で実現できますよ?

投稿2016/11/02 01:19

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問