
プログラム初心者です。
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で質問しましょう!
似たような質問が見つかりました
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- PHP isset — 変数が宣言されていること、そして null とは異なることを検査 1 2022/03/27 17:34
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0バイトのテキストファイル
-
Eclipseで検索ができなくなった
-
main関数のコマンドライン引数...
-
HTMLテキストリンクでExcelファ...
-
C++によるファイル送受信プログ...
-
VBS ファイルマージ処理
-
C++.NET 2003 「空のドキュメ...
-
サイトマップにサブドメインを...
-
accessでクエリをExcelにエクス...
-
CSVファイルの時刻の形式について
-
COBOL、項目末尾に空白がある場...
-
マックで作ったPDFファイル...
-
VBA 参照先で選んだファイルを...
-
ソフトが使っている文字コード...
-
既存のテキストファイルを開く方法
-
コマンドプロンプトのテキスト...
-
Aviutl音声ファイルについて
-
別のサーバーのテキストファイ...
-
ATTファイルってどうやって開け...
-
ファイルのダウンロードが正常...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0バイトのテキストファイル
-
Eclipseで検索ができなくなった
-
【Excel VBA】取り込んだファイ...
-
C++.NET 2003 「空のドキュメ...
-
HTMLまたはJavaScriptでフ...
-
VBAで、JPG写真の撮影日時を読...
-
main関数のコマンドライン引数...
-
HTMLテキストリンクでExcelファ...
-
ファイル作成日時と更新日時を...
-
リソースファイルを認識してく...
-
Javaのファイルダウンロードに...
-
2GB以上のファイルを扱う方法
-
C#について質問【複数の.datフ...
-
ディレクトリのサイズの取得
-
PHPからベーシック認証のかかっ...
-
<input type="file" で初期値...
-
VB2008 iniファイルの全セクシ...
-
教えて下さい。
-
サイトマップにサブドメインを...
-
vbaの構文の修正相談(xmlファ...
おすすめ情報