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

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

ただいまの
回答率

87.37%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,177

score 21

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

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

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

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

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

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

以下ソース

//------------------------------------------------------------------------------
// 送信ボタン押下処理
//------------------------------------------------------------------------------
void CZyuSyoDlg::OnBnClickedGo()
{
    struct Queue  *head;
    head = QueCut();

    //------------//
    //名前部の取得//
    //------------//
    CString strName;
    ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName );
    //CString → charへの変換
    strcpy_s( head->data.name, strName );

    //------------//
    //住所部の取得//
    //------------//
    CString strHome;
    ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome );
    strcpy_s( head->data.home, strHome );

    //------------//
    //年齢部の所得//
    //------------//
    CString strTosi;
    ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi );
    strcpy_s( head->data.tosi, strTosi );

    //------------//
    //Noの所得    //
    //------------//
    CString strNo;
    m_Combo.GetLBText(m_Combo.GetCurSel(),strNo);

    //テキスト用テキストファイル読み込み
    if( strNo != "" )
    {
    CString strNoData;
    CStdioFile ZyuSyoFile3("NoData.txt", CFile::modeCreate | CFile::modeNoTruncate |
        CFile::modeRead | CFile::typeText);
    //1行ずつ読み込ませる
    BOOL strRead2;
    while( 1 )
    {
        strRead2 = ZyuSyoFile3.ReadString( strNoData );
        if( strRead2 == FALSE )
        {
            break;
        }
        //読み込んだ値と取得した値を比べる
        m_No = strNoData;
        if( m_No == strNo )
        {
            MessageBox("Noが重複しています!","†警告†",MB_OK | MB_ICONSTOP);
            return;
        }

    }
    }

    strcpy_s( head->data.no, strNo );

    //----------------//
    //性別の取得(男性)//
    //----------------//
    CString strType;
    if( ( (CButton*)GetDlgItem(IDC_RADIO_B) )->GetCheck() == BST_CHECKED )
    {
        strType = ("男性");
        strcpy_s( head->data.type, strType );
    }

    //----------------//
    //性別の判定(女性)//
    //----------------//
    if( ( (CButton*)GetDlgItem(IDC_RADIO_G) )->GetCheck() == BST_CHECKED )
    {
        strType = ("女性");
        strcpy_s( head->data.type, strType );
    }


    //----------------//
    //リストへ追加    //
    //----------------//
    // リストコントロール 行の追加
    int count = m_List.GetItemCount();
    m_List.InsertItem(count, strNo);                              //No行を追加
    m_List.SetItem(count, 1, LVIF_TEXT, strType, 0, 0, 0, 0);      //性別行を追加
    m_List.SetItem(count, 2, LVIF_TEXT, strName, 0, 0, 0, 0);     //名前列を追加
    m_List.SetItem(count, 3, LVIF_TEXT, strTosi, 0, 0, 0, 0);     //年齢行を追加
    m_List.SetItem(count, 4, LVIF_TEXT, strHome, 0, 0, 0, 0);     //住所行

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

    //テキストファイルの最後に追加していく
    ZyuSyoFile.SeekToEnd();

    //各要素をテキストファイルに
    ZyuSyoFile.WriteString( strNo   + "\n" );
    ZyuSyoFile.WriteString( strType + "\n" );
    ZyuSyoFile.WriteString( strName + "\n" );
    ZyuSyoFile.WriteString( strTosi + "\n" );
    ZyuSyoFile.WriteString( strHome + "\n" );

    //テキストファイルを閉じる
    ZyuSyoFile.Close();

    //No用テキストファイル作成
    CStdioFile ZyuSyoFile2;
    ZyuSyoFile2.Open("NoData.txt",CFile::modeReadWrite |
        CFile::shareDenyNone | CFile::modeCreate | CFile::modeNoTruncate);
    ZyuSyoFile2.SeekToEnd();
    ZyuSyoFile2.WriteString( strNo + "\n" );
    ZyuSyoFile2.Close();

    QueData(head);
}
//------------------------------------------------------------------------------
// 更新ボタン
//------------------------------------------------------------------------------
void CZyuSyoDlg::OnBnClickedHenB()
{ 
    POSITION pos;
    while( 1 )
    {
        pos = m_List.GetFirstSelectedItemPosition();
        if(!pos)
        {
            break;
        }
        int nItem = m_List.GetNextSelectedItem(pos);
        CString strName;
        ((CEdit*)GetDlgItem(IDC_NAME_I))->GetWindowText( strName );
        CString strHome;
        ((CEdit*)GetDlgItem(IDC_HOME_I))->GetWindowText( strHome );
        CString strTosi;
        ((CEdit*)GetDlgItem(IDC_TOSI_I))->GetWindowText( strTosi );

        m_List.SetItem(nItem, 2, LVIF_TEXT, strName, 0, 0, 0, 0); 
        m_List.SetItem(nItem, 3, LVIF_TEXT, strTosi, 0, 0, 0, 0);
        m_List.SetItem(nItem, 4, LVIF_TEXT, strHome, 0, 0, 0, 0);
        break;
    }
} 


//------------------------------------------------------------------------------
// 削除ボタン
//------------------------------------------------------------------------------
void CZyuSyoDlg::OnBnClickedDelB()
{
    POSITION  pos;
    while( 1 )
    {
        pos = m_List.GetFirstSelectedItemPosition();
        if(!pos)
        {
            break;
        }
        int nItem = m_List.GetNextSelectedItem(pos);
        m_List.DeleteItem(nItem);
    }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/11 16:25

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

    キャンセル

  • 2016/11/11 16:32

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

    キャンセル

  • 2016/11/11 16:39

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

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る