- ベストアンサー
エディットボックスの内容をテキストファイルに書き込み・読み込みしたい
- エディットボックスに入力するのは数値のみなので、数値の書き込み・読み込みを行いたいがうまくいかない。質問は、エディットボックスのデータを格納する方法として、それぞれに変数を用いるか、1つの変数を配列として用いるかを尋ねている。また、書き込みや読み込みの際の挙動についてもわからないとしている。
- エディットボックスの内容を1つのテキストファイルに書き込み、後々に読み込みを行いたい。数値の書き込み・読み込みを行いたいが、何かうまくいかないようだ。質問は、エディットボックスのデータを格納する方法についてのアドバイスを求めている。
- エディットボックスには数値のみを入力し、それを1つのテキストファイルに書き込んで後で読み込みたいが、上手くいかないようだ。エディットボックスのデータを格納する方法と、書き込みや読み込みの際の挙動についてのアドバイスを求めている。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 WriteFile()/ReadFile()を連続で呼ぶと、ファイルポインタが後方へ移動します。 ファイルポインタを任意の場所に移動する場合はSetFilePointer()を使用します(先頭に戻したい場合など)。 参考程度に。 以下は「書き込み後・読み取り後」にファイルハンドルを閉じる場合。 #include<windows.h> void wfile(LPCTSTR file) { //本当はGetDlgItemInt()を使用してエディットボックスから数値を持ってくる INT edit0 = 123; INT edit1 = 456; DWORD dwComplete = 0; HANDLE hFile = ::CreateFile(file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NULL, NULL); ::WriteFile(hFile, &edit0, sizeof(edit0), &dwComplete, NULL); ::WriteFile(hFile, &edit1, sizeof(edit1), &dwComplete, NULL); ::CloseHandle(hFile); } void rfile(LPCTSTR file) { INT edit0 = 0;//123が入る筈 INT edit1 = 0;//456が入る筈 DWORD dwComplete = 0; HANDLE hFile = ::CreateFile(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL); ::ReadFile(hFile, &edit0, sizeof(edit0), &dwComplete, NULL); ::ReadFile(hFile, &edit1, sizeof(edit1), &dwComplete, NULL); //此処でSetDlgItemInt()を使用してエディットボックスに数値を送る ::CloseHandle(hFile); } int main() { LPCTSTR file = TEXT("edit.txt"); ::wfile(file); ::rfile(file); return 0; } 以下はファイルを閉じずに先頭へ戻す場合。 void wfile(HANDLE hFile) { INT edit0 = 123; INT edit1 = 456; DWORD dwComplete = 0; ::WriteFile(hFile, &edit0, sizeof(edit0), &dwComplete, NULL); ::WriteFile(hFile, &edit1, sizeof(edit1), &dwComplete, NULL); } void rfile(HANDLE hFile) { INT edit0 = 0; INT edit1 = 0; DWORD dwComplete = 0; ::ReadFile(hFile, &edit0, sizeof(edit0), &dwComplete, NULL); ::ReadFile(hFile, &edit1, sizeof(edit1), &dwComplete, NULL); } int main() { HANDLE hFile = ::CreateFile(TEXT("edit.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NULL, NULL); ::wfile(hFile); //此処でファイルポインタを先頭に戻す ::SetFilePointer(hFile, 0, NULL, FILE_BEGIN); ::rfile(hFile); ::CloseHandle(hFile); return 0; }
その他の回答 (1)
- machongola
- ベストアンサー率60% (434/720)
こんばんは。御礼頂きました。 う~む、もしかしたら、ファイルを上書き作成モードで開いているのでは。 当方が書いたサンプルコードはファイルに「読み・書き」を行う事で確認をしてみる程度のものなので、実践的な処理の流れで使用される事を一切考慮していません。 ですので、処理の流れに応じてファイルの開き方を変える必要があります。 例えば、既に存在するファイルを開く時、CREATE_ALWAYSを指定してしまうと、ファイルが上書き作成されるので、以前のデータがお釈迦になります。 その他、CreateFile()の6番目パラメータにFILE_ATTRIBUTE_NORMALを指定しないとまずいかもしれません。 後、そのコードを書いて動作させたのはwindows2000 sp4とVC6.0です。 「CreateFile()」 http://msdn.microsoft.com/ja-jp/library/cc429198.aspx //既にあるファイルを「読み・書き」モードで開く HANDLE hFile = ::CreateFile(TEXT("edit.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //ファイルが無かった if(hFile == INVALID_HANDLE_VALUE) { //此処でファイルを「読み・書き」モードで作成する hFile = ::CreateFile(TEXT("edit.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); } まあ、当方が思い当たる節はこれ位でしょうか・・・。
お礼
こんにちは。 返事が遅くなり申し訳ありません。 machongolaさんのアドバイスも含めてあれからいろいろ試してみたところ、やはりReadFileとWriteFileでは数値の読み書きができませんでした。私の勉強不足です。 そこで最初からまっさらにして、使う関数から考え、fopen関数あたりを使ってみました。するとfscanfとfprintfで数値の読み書きに成功しました。これは、結果的に方向性として使う関数が違ったのでしょうか。 とりあえず、 たくさんのわかりやすいアドバイスありがとうございました。 おかげさまでまたプログラミングについて1つ詳しくなりました。 感謝いたします。
お礼
とても早いご回答ありがとうございます。 わかりやすいサンプルプログラムのおかげで、再度エディットボックスを出したときに数値が入っているようになりました。しかし、ファイルへの書き込みがされていません。いろいろ確認した結果、多分読み込みもされていないようです。ファイル作成には成功していたのですが・・・ このため、アプリを終了し、再度アプリを起動したときに、エディットボックス内の数値はすべて0になっていました。 WriteFileやReadFileで数値を扱う場合、何か工夫がいるのでしょうか。再度質問申し訳ありません。 私自身、もう一度よく検討してみます。