- - PR -
バイナリファイルの内容をすべてmallocした構造体に設定したい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-21 10:41
バイナリファイルに、ある構造体のデータが10件分あったとして
それを構造体をmallocしてバイナリデータの件数(10件分)を確保するほうほうで fseek をループして最大件数を取得してから構造体をmallocするのでしょうか? その具体的な方法ソースがあれば幸いです。 struct person{ char name[12]; int age; } FILE *fp; person ps; int i; fp=fopen("mytxt.d","rb"); //ここ[//]の部分をどう記述していいかわからず //while(1){ //fseekで最大件数を //i++ //} malloc(ps * i) | ||||||||
|
投稿日時: 2006-02-21 11:07
普通に fread 関数で読み込むのでは?
mallocするなら、
両方とも動作確認していないのであしからず。 # なんか、ソースのコメントからだと最大件数が不明っぽいですけど。。。 # ファイルの末尾までSeekして、その値(ファイルのサイズ)をsizeof( struct person )で割った値が最大件数になるのかな。 [ メッセージ編集済み 編集者: Blue 編集日時 2006-02-21 11:13 ] | ||||||||
|
投稿日時: 2006-02-21 11:38
最大件数を最初から求めずに、freadを繰り返していきながらreallocしてはどうでしょう?
配列でなくてもよければvector(STL),CArray(MFC),ArrayList(.Net)などに追加していくのもありです。 _________________ by うちうせん | ||||||||
|
投稿日時: 2006-02-21 11:48
ファイルサイズを取得して、レコード数を算出。その後メモリを確保して読み込む。
あるいはメモリマップドファイルを使って、メモリに割り当てる。ファイルサイズや読み書きの頻度によっては、こちらの方が高速です。 | ||||||||
|
投稿日時: 2006-02-21 11:52
malloc前提なので C言語 の質問なのかなと思っています。(fopenもそうだし) # C++なら malloc を使うより new を使いましょうといいたい。 # そうすれば、person* ps = new person[ 10 ]; # とできますしね。 C言語で動的配列をつくるのは面倒ですからね。 | ||||||||
|
投稿日時: 2006-02-21 12:04
しゅう改めうちうせんです。 そうかなぁとは思ったんですが.Net板だったので書いてみました^^; _________________ by うちうせん | ||||||||
|
投稿日時: 2006-02-21 12:23
# ファイルの末尾までSeekして、その値(ファイルのサイズ)をsizeof( struct person )で割った値が最大件数になるのかな。
の部分についてのソースがほしいです。 | ||||||||
|
投稿日時: 2006-02-21 12:44
# 掲示板では、返信をもらったらお礼を言いましょう。
ftell + fseek を組み合わせて全体のファイルのサイズを求めます。
|