アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラム初心者です。

VS2005を使用してWindowsアプリケーションの実装を行っているのですが、数個あるエディットボックスの内容を1つのテキストファイルに書き込み、そして後々に読み込みを行いたいと考えています。私の場合、エディットボックスに入力するのは数値のみなので、数値の書き込み・読み込みを行いたいのですがうまくいきません。

そこで質問なんですが、数個のエディットボックスのデータを格納する方法として、それぞれに変数を用いていいのでしょうか。
ex) edit0 = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE);
edit1 = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE);

それとも、1つの変数を配列として用いたほうがいいのでしょうか。
ex) edit[0] = GetDlgItemInt(hDlg, IDC_EDIT1, NULL, TRUE);
edit[1] = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, TRUE);

もし前者として、その場合はWriteFileで書き込む(読み込む)場合どのようにしたら良いのでしょう。WriteFileを連続で書くとなると、上書きになるのか後ろから追加されるのかイメージがついていない状態です。

わかりずらい説明で申し訳ありません。
ご教授お願いいたします。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

とても早いご回答ありがとうございます。
わかりやすいサンプルプログラムのおかげで、再度エディットボックスを出したときに数値が入っているようになりました。しかし、ファイルへの書き込みがされていません。いろいろ確認した結果、多分読み込みもされていないようです。ファイル作成には成功していたのですが・・・
このため、アプリを終了し、再度アプリを起動したときに、エディットボックス内の数値はすべて0になっていました。

WriteFileやReadFileで数値を扱う場合、何か工夫がいるのでしょうか。再度質問申し訳ありません。

私自身、もう一度よく検討してみます。

お礼日時:2009/11/06 11:27

 こんばんは。

御礼頂きました。

 う~む、もしかしたら、ファイルを上書き作成モードで開いているのでは。
 当方が書いたサンプルコードはファイルに「読み・書き」を行う事で確認をしてみる程度のものなので、実践的な処理の流れで使用される事を一切考慮していません。
 ですので、処理の流れに応じてファイルの開き方を変える必要があります。

 例えば、既に存在するファイルを開く時、CREATE_ALWAYSを指定してしまうと、ファイルが上書き作成されるので、以前のデータがお釈迦になります。
 その他、CreateFile()の6番目パラメータにFILE_ATTRIBUTE_NORMALを指定しないとまずいかもしれません。
 後、そのコードを書いて動作させたのはwindows2000 sp4とVC6.0です。

 「CreateFile()」
 http://msdn.microsoft.com/ja-jp/library/cc429198 …
 
 //既にあるファイルを「読み・書き」モードで開く
 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);
 }

 まあ、当方が思い当たる節はこれ位でしょうか・・・。
    • good
    • 0
この回答へのお礼

こんにちは。
返事が遅くなり申し訳ありません。

machongolaさんのアドバイスも含めてあれからいろいろ試してみたところ、やはりReadFileとWriteFileでは数値の読み書きができませんでした。私の勉強不足です。

そこで最初からまっさらにして、使う関数から考え、fopen関数あたりを使ってみました。するとfscanfとfprintfで数値の読み書きに成功しました。これは、結果的に方向性として使う関数が違ったのでしょうか。

とりあえず、
たくさんのわかりやすいアドバイスありがとうございました。
おかげさまでまたプログラミングについて1つ詳しくなりました。
感謝いたします。

お礼日時:2009/11/10 11:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!