
プログラム初心者です。
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を連続で書くとなると、上書きになるのか後ろから追加されるのかイメージがついていない状態です。
わかりずらい説明で申し訳ありません。
ご教授お願いいたします。
No.1ベストアンサー
- 回答日時:
こんばんは。
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;
}
とても早いご回答ありがとうございます。
わかりやすいサンプルプログラムのおかげで、再度エディットボックスを出したときに数値が入っているようになりました。しかし、ファイルへの書き込みがされていません。いろいろ確認した結果、多分読み込みもされていないようです。ファイル作成には成功していたのですが・・・
このため、アプリを終了し、再度アプリを起動したときに、エディットボックス内の数値はすべて0になっていました。
WriteFileやReadFileで数値を扱う場合、何か工夫がいるのでしょうか。再度質問申し訳ありません。
私自身、もう一度よく検討してみます。
No.2
- 回答日時:
こんばんは。
御礼頂きました。う~む、もしかしたら、ファイルを上書き作成モードで開いているのでは。
当方が書いたサンプルコードはファイルに「読み・書き」を行う事で確認をしてみる程度のものなので、実践的な処理の流れで使用される事を一切考慮していません。
ですので、処理の流れに応じてファイルの開き方を変える必要があります。
例えば、既に存在するファイルを開く時、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);
}
まあ、当方が思い当たる節はこれ位でしょうか・・・。
こんにちは。
返事が遅くなり申し訳ありません。
machongolaさんのアドバイスも含めてあれからいろいろ試してみたところ、やはりReadFileとWriteFileでは数値の読み書きができませんでした。私の勉強不足です。
そこで最初からまっさらにして、使う関数から考え、fopen関数あたりを使ってみました。するとfscanfとfprintfで数値の読み書きに成功しました。これは、結果的に方向性として使う関数が違ったのでしょうか。
とりあえず、
たくさんのわかりやすいアドバイスありがとうございました。
おかげさまでまたプログラミングについて1つ詳しくなりました。
感謝いたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
openglで音楽を再生する
-
Javaのファイルダウンロードに...
-
0バイトのテキストファイル
-
クライアントのEXCELファイルの...
-
MFC SDIアプリで開いているファ...
-
ファイル生成
-
C++によるファイル送受信プログ...
-
C#で文字列リソースを扱う
-
URIでローカルのファイルを指定...
-
ATTファイルってどうやって開け...
-
accessでクエリをExcelにエクス...
-
CSVファイルの時刻の形式について
-
既存のテキストファイルを開く方法
-
“ファイルに出力”した印刷ファ...
-
コマンドプロンプトのテキスト...
-
フォーム無しでアプリを作成す...
-
MT-4トレード結果をエクセルに...
-
Microsoft Outlookで、vCardを...
-
[VB.NET] 処理の高速化を行いた...
-
エクセルVBAでメールの自動作成...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
Eclipseで検索ができなくなった
-
0バイトのテキストファイル
-
VBAで、JPG写真の撮影日時を読...
-
C++によるファイル送受信プログ...
-
main関数のコマンドライン引数...
-
【VBA】複数CSVの特定範囲を1つ...
-
ファイル作成日時と更新日時を...
-
Javaのファイルダウンロードに...
-
HTMLテキストリンクでExcelファ...
-
2GB以上のファイルを扱う方法
-
openglで音楽を再生する
-
エディットボックスの内容をテ...
-
VB2008 iniファイルの全セクシ...
-
VB6でTIFF図のプロパティを...
-
GetOpenFileName()について
-
EUCコードをSHIFT-JISに変換したい
-
タスクバーのアイコンについて
-
C++.NET 2003 「空のドキュメ...
-
【VBA】印刷マクロのループ処理...
おすすめ情報