C言語関係掲示板

過去ログ

No.257.ファイルデータの登録、削除の方法


No.1536

ファイルデータの登録、削除の方法
投稿者---snow(2002/05/20 11:45:35)


ファイルのデータを登録、削除するプログラムを作ったのですが、
何か簡単な(メモリを食わない)方法ってありますか?

現状のプログラムは
1.プログラムを実行するとファイルの中身を呼び出して構造体リストに読み出す
2.登録削除を実行。このとき登録は、IDの昇順で登録(挿入)されます
3.終了時にファイルを上書きして終了
というプログラムになっています。

これだとどうしても、データが大きくなるとそれに比例してメモリの仕様領域が
大きくなってしまいます。
登録時にIDの昇順があるのでデータを挿入する為にこうしたのですが・・・
何かよい方法が有りましたらよろしくお願いします。

No.1544

Re:ファイルデータの登録、削除の方法
投稿者---ともじ(2002/05/20 16:17:29)


こんにちは。

>ファイルのデータを登録、削除するプログラムを作ったのですが、
>何か簡単な(メモリを食わない)方法ってありますか?

過去ログにファイルの115のNo.662が参考になると思いますので、見てみてください。

No.1546

Re:ファイルデータの登録、削除の方法
投稿者---kikk(2002/05/20 16:51:43)


ども。


訂正&補足です。

>過去ログにファイルの115のNo.662
のなかの、2のtmpnam()はなかったことにしてください。カレントではなく
システムのテンポラリにできるようなので。


あと、No.1545はNo.662の3についてのものです。


では。

No.1545

Re:ファイルデータの登録、削除の方法
投稿者---kikk(2002/05/20 16:44:44)


ども。


>ファイルのデータを登録、削除するプログラムを作ったのですが、
>何か簡単な(メモリを食わない)方法ってありますか?
>
>現状のプログラムは
>1.プログラムを実行するとファイルの中身を呼び出して構造体リストに読み出す
>2.登録削除を実行。このとき登録は、IDの昇順で登録(挿入)されます
>3.終了時にファイルを上書きして終了
>というプログラムになっています。

通常、2回以上アクセスしないデータはずーっと保持しておく必要は
ありません。それ以外の理由でファイルを全部読み込んでから処理、
というようなことを行うのは以下のような考えによるものだと思います。

1.処理対象がメモリのみになるので簡単に(というか見通しがよく)なる
2.ファイルアクセスの回数が減る

上記のような、挿入/削除場所を検索&実行というような流れでは、
各データは比較時の1回しかアクセスされません。したがって、
ちまちま1要素ずつファイルから読んで比較すればとりあえずOKです。

これでは(上記2.の観点から)芸がないというのであれば、全部ではなく
適当な量だけバッファに読み込んで、比較し、バッファ中の要素を
全部チェックしたら、また読む、というのを繰り返せばよいかと。
なお、挿入/削除時にデータを前後にずらすのにも同じ方法がつかえます。

/*検索部のみ*/
/*めんどうなので入力はバイナリとする*/
#define N 16 /*適当に*/

struct RECORD rec_buf[sizeof(struct RECORD)*N];
struct RECORD *p_found;

offset=0;
while ((n_read=fread(rec_buf,sizeof(struct RECORD),N,fp))>0) {
for (i=0;i<n_read;i++) {
if (/*検索条件*/) {
/*みつかった*/
p_found=&rec_buf[i]:
break;
}
}
offset+=i;
if (i==n_read)
break;
}

/*
n_read>0ならばみつかった。
p_foundがさすデータは、
fseek(fp,offset*sizeof(struct RECORD),SEEK_SET);
から読めるものと同じ。
*/

だいたいこんな感じ。高速化の必要があればバイナリサーチを応用したもの
を自作してください。


では。

No.1559

Re:ファイルデータの登録、削除の方法
投稿者---snow(2002/05/21 08:47:50)


お返事ありがとうございました。
ファイルのアクセス回数を増やしたくなくて、いろいろ悩んでいました。
さっそくこの方法をためして見ようと思います。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.28
Copyright(c) 2000-2002 TOMOJI All Rights Reserved