- ベストアンサー
エディットボックスの数値をテキストファイルとして保存する方法
- プログラム初心者の方がエディットボックスの数値をテキストファイルとして保存する方法について教えてください。
- リソース機能を用いて親ウインドウのメニューバーから子ウインドウのダイアログを作成し、その子ウインドウ上にエディットボックスのコントロールを作成しています。エディットボックスに入力された数値を新しく設けたボタン(IDC_BUTTON1)が押された時に、名前をつけたテキストファイルに上書きして保存する方法を教えてください。
- MFCの機能は使用していませんが、コモンダイアログボックスを使って上記の機能を実装したいです。どのような関数を使えば良いのか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ファイル操作についての知識が不足していると受け取って宜しいのでしょうか? それともGetOpenFileName、GetSaveFileNameの使い方がわかっていないのでしょうか? 前者であれば、 fopen()かCreateFile()を調べてみてください。 後者であれば、今回の場合は strFile にパスが格納される"だけ"ですので、 GetOpenFileName、GetSaveFileNameの後にfopen()またはCreateFile()を実行する必要があります。 あと、APIや標準ライブラリを使用する際は戻り値でエラーチェックした方がいいですよ。 if( !GetOpenFileName(&ofn) ) { // エラー発生 } 見たいな感じで。
その他の回答 (1)
- keibou21
- ベストアンサー率31% (18/58)
エディットボックスは数値で入っているのではなく、文字列で入っています。 ですから、数値->文字列 変換は必要ありません。 プログラムの流れは次のようになります。 1.IDC_BUTTON1が押されたときにエディットボックスの文字列を取得する 2.指定したパス?のファイルを上書きモードで開く 3.1で取得した文字列をファイルの最後尾に書き込む 4.ファイルを閉じる まずは1から順番にやっていって見てください。 1のヒントはGetWindowTextとGetDlgItemです。
お礼
お世話になります。 質問させていただいてからあれこれやってみたのですが、コモンダイアログを開くことができました。 ↓は作成した子ウインドウのソースの一部なのですが、 このダイアログ上に私が作成した名前をつけて保存ボタンを押した時(IDC_BUTTON3)に、ご教授いただいたGetWindowText、GetDlgItem関数を用いてエディットボックスの値をBuff1,Buff2にそれぞれ格納しました。 しかし、この値を新にテキストとして保存したり、その保存したテキストから値を読み込んで、それぞれのエディットボックスに上書きするようにしたいのですが、どうしてもうまくいきません。 恐れ入りますがアドバイスをいただけると助かります。お忙しい時間を私に割いてくださり申し訳ございません。 BOOL CALLBACK DlgWndProc(HWND hWnd1, UINT message, WPARAM wParam, LPARAM lParam) { TCHAR Buff1[5],Buff2[5]; static OPENFILENAME ofn; static TCHAR strFile[MAX_PATH]; switch(message) { case WM_INITDIALOG: SetDlgItemInt(hWnd1,IDC_EDIT1,100,FALSE); SetDlgItemInt(hWnd1,IDC_EDIT2,100,FALSE); //コモンダイアログの設定 ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = hWnd1; ofn.lpstrFile = strFile; //選択されたファイル名を代入するためのバッファ ofn.nMaxFile = MAX_PATH; ofn.lpstrFilter = "データ\0*.txt\0"; ofn.nFilterIndex = 0; ofn.Flags = OFN_FILEMUSTEXIST; return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BUTTON2: //開くボタンが押された時の処理。 //ここの処理がわかりません。 GetOpenFileName(&ofn); SetWindowText(hWnd1 , strFile); return TRUE; case IDC_BUTTON3: //名前をつけて保存ボタンが押された時の処理。 GetWindowText(GetDlgItem(hWnd1,IDC_EDIT1),Buff1,5); GetWindowText(GetDlgItem(hWnd1,IDC_EDIT2),Buff2,5); //ここの処理がわかりません。 GetSaveFileName(&ofn); SetWindowText(hWnd1 , strFile); return TRUE;
補足
迅速なお返事と的確なアドバイスありがとうございます! TCHAR sBuff[5]; GetWindowText(GetDlgIte(hWnd,IDC_EDIT1),sBuff,5); と宣言して、 sbuffにエディットボックスの文字列を格納したところまではうまくいっていたのですが・・・、 ここからがよくわかりません。 構想としては、このsBuffに格納された文字列を別に作ったコントロールであるボタン(IDC_BUTTON1)を押した時に、別のテキストファイルとして名前をつけて保存し(例えばここでaaa.txtとして保存したとします。)、 さらに別に作ったコントロールであるボタン(IDC_BUTTON2)を押した時に、先ほどのaaa.textのファイルを開き、 最初のエディットボックスに上書きという形にしたいのです。 この場合、参考書を読んだ結果、GetSaveFileNameとGetOpenFileName関数を使ってコモンダイアログを使うと便利なのかなと思ったのですが、この関数の使い方がよくわからなくて。 もう少し調べて頑張ってみます。恐れ入りますがまた質問させていただくと思います。 その時はご教授よろしくお願い致します。
お礼
newfile = fopen("strFile","r+"); 何度も申し訳ございませんでした。 たった今、 "strFile"の""をなくしたことで、 問題が解決いたしました。 keibou21さまがご丁寧に教えてくださり、本当に感謝しております。ありがとうございました!!
補足
迅速なお返事ありがとうございます。 おそらくファイル操作、また、GetOpenFileName,GetSaveFileNameの使い方共に理解不十分であるのだと思います。申し訳ございません。 fopenでファイルを開くよう↓のようプログラムを書いてみたのですが、データを読み込んでくれませんでした。 fopen(" ","r+")の" "の中に指定している変数が間違っているのでしょうか?? 何度も申し訳ないです。 case IDC_BUTTON2: //開くボタンが押された時の処理。 GetOpenFileName(&ofn); wsprintf(strMsg, "ファイルが選択されました。\nファイル名は\n%s\nです。", strFile); MessageBox(NULL, strMsg, "", MB_OK | MB_ICONINFORMATION); newfile = fopen("strFile","r+"); //←ここです。 if(newfile == NULL){ MessageBox(hWnd1,"データを読み込めませんでした","",MB_OK); } else{ fscanf(newfile,"%d%d",&a1,&b1); } fclose(newfile); } return TRUE;