どうも、クリリンです。
早速ですが、質問させてください。
ファイルから約100~1000件ぐらい入っているレコードの情報を、それぞれのデータごと
に格納するには、構造体を使うのが最も有効的だと判断しているのですが、レコード数がファイ
ルによって未知数の為、動的な構造体を定義しないといけないと思っております。
その為には、どのように記述したらよろしいのでしょうか?
どうか、みなさんの知恵をお貸しください。
よろしくお願いします。
質問です。
1レコードを格納する構造体そのものが動的なのか?
それとも複数レコードを格納したいがレコード数が未知数な為、
構造体配列の配列数が動的なのか?
どちらでしょうか?
どうも、クリリンです。
NGA さん、ありがとうございます。
質問があいまいですいません。
1レコードを格納する構造体自体は動的ではなく、
単に、レコードの数が未知数な為、構造体配列を動的にしたいのです。
どうか宜しくお願いします。
「配列」にこだわるなら、malloc()やGlobalAlloc()などで任意の件数分のメモリを確保し、
足りなくなったら再確保...という感じでしょうか。
あまりよろしいやり方ではありませんけどね。
「配列」である必要がなければ、自己参照構造体にしてリスト構造にするとか。
MFCでもよければ、CArrayを使うとか。
質問です。
ファイル上における1レコードのサイズは固定長ですか?
それとも可変長ですか?
みなさん、ご回答ありがとうございます。
ファイル上における1レコードのサイズは固定長です。
>ファイル上における1レコードのサイズは固定長です。
ファイルサイズからレコード数が計算できますよね?
格納するだけなら、構造体配列を動的に確保するのが簡単かと思います。
自分がよくやるやり方としては、
typedef struct
{
CString a ;
CString b ;
CString c ;
}aaa_t ;
CArray<aaa_t,aaa_t> m_aaaArray ;
こんな感じです。
他の方々の回答といってることは同じですが、ご参考ってことで。
とりあえず、ん さんのやり方を試してみたいと思います。
ところで、双方向リストを思いついたのですが、これを使用した場合、[qsort]は難しいのでし
ょうか?また、構造体内に連番用の変数を入れており、ソート終了後に連番を振りなおしたいの
ですが、やはり、双方向リストでは、処理が遅くなってしまうのでしょうか?
結論的には、固定長ファイルのデータ取得および追加、削除、更新、参照はどの方法が一番適切
なのか教えていただけないでしょうか?
よろしくお願いします。
>結論的には、固定長ファイルのデータ取得および追加、削除、更新、参照はどの方法が一番適
切
>なのか教えていただけないでしょうか?
ファイルサイズが固定長ならただの動的配列でもよいと思いますが、
そうでないならリスト構造にするのが無難な気がします。
>ところで、双方向リストを思いついたのですが、これを使用した場合、[qsort]は難しいので
し
>ょうか?
配列でないと……。
NGA さん、いつも回答くださいまして、ありがとうございます。
やはり、双方向リストはバブルソートしかできないのでしょうか?
でも、qsortの理屈は、ポインタの入れ替えですよね?
だったら、双方向リストのqsort版を作るのでは駄目ですか?
っていうか、そうゆうのは無いのですか?
色々と質問してすいません。
>でも、qsortの理屈は、ポインタの入れ替えですよね?
ポインタの入替ではなく、要素そのものの入替です。
>クイックソートでは(昇順ソートの場合)、まず適当な値Xを選ぶ。
>その時、配列のX以下の要素数とX以上の要素の数とはなるべく同じになるようにする。
>X以下の要素を配列の前半に、X以上の要素を配列の後半に集める。
>配列の前半が要素数が2以上なら、配列の前半を再帰的にクイックソートする。
>配列の後半が要素数が2以上なら、配列の後半を再帰的にクイックソートする。
>このように配列を次々に2つにして、それぞれについてソートを行う。
だそうです。
>ポインタの入替ではなく、要素そのものの入替です。
あ、すいません。勘違いしてました。
リストポインタの配列を作り、ポインタで参照してソートをする
クイックソートを作るというのはどうでしょう?
>リストポインタの配列を作り、ポインタで参照してソートをする
>クイックソートを作るというのはどうでしょう?
そうです。そのことを言いたかったのですが・・・