- PR -

バイナリファイルの内容をすべてmallocした構造体に設定したい

投稿者投稿内容
関取
会議室デビュー日: 2005/03/10
投稿数: 19
投稿日時: 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)
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-02-21 11:07
普通に fread 関数で読み込むのでは?
コード:


FILE* fp;
struct person ps[ 10 ];

fp = fopen( "mytxt.d", "rb" );
fread( &ps, sizeof( ps ), 1, fp );



mallocするなら、
コード:


FILE* fp;
struct person ps;
unsigned char* b;

fp = fopen( "mytxt.d", "rb" );
b = ( unsigned char* )malloc( sizeof( ps ) * 10 );
fread( b, sizeof( ps ), 10, fp );



両方とも動作確認していないのであしからず。

# なんか、ソースのコメントからだと最大件数が不明っぽいですけど。。。
# ファイルの末尾までSeekして、その値(ファイルのサイズ)をsizeof( struct person )で割った値が最大件数になるのかな。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-02-21 11:13 ]
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-21 11:38
最大件数を最初から求めずに、freadを繰り返していきながらreallocしてはどうでしょう?
配列でなくてもよければvector(STL),CArray(MFC),ArrayList(.Net)などに追加していくのもありです。

_________________
by うちうせん
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-02-21 11:48
ファイルサイズを取得して、レコード数を算出。その後メモリを確保して読み込む。

あるいはメモリマップドファイルを使って、メモリに割り当てる。ファイルサイズや読み書きの頻度によっては、こちらの方が高速です。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-02-21 11:52
引用:

しゅうさんの書き込み (2006-02-21 11:38) より:
配列でなくてもよければvector(STL),CArray(MFC),ArrayList(.Net)などに追加していくのもありです。


malloc前提なので C言語 の質問なのかなと思っています。(fopenもそうだし)
# C++なら malloc を使うより new を使いましょうといいたい。
# そうすれば、person* ps = new person[ 10 ];
# とできますしね。
C言語で動的配列をつくるのは面倒ですからね。
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-21 12:04
引用:

Blueさんの書き込み (2006-02-21 11:52) より:
malloc前提なので C言語 の質問なのかなと思っています。(fopenもそうだし)
# C++なら malloc を使うより new を使いましょうといいたい。
# そうすれば、person* ps = new person[ 10 ];
# とできますしね。
C言語で動的配列をつくるのは面倒ですからね。


しゅう改めうちうせんです。
そうかなぁとは思ったんですが.Net板だったので書いてみました^^;
_________________
by うちうせん
関取
会議室デビュー日: 2005/03/10
投稿数: 19
投稿日時: 2006-02-21 12:23
# ファイルの末尾までSeekして、その値(ファイルのサイズ)をsizeof( struct person )で割った値が最大件数になるのかな。
の部分についてのソースがほしいです。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-02-21 12:44
# 掲示板では、返信をもらったらお礼を言いましょう。

ftell + fseek を組み合わせて全体のファイルのサイズを求めます。

コード:

long file_size;
long array_size;

fseek( fp, 0, SEEK_END );
file_size = ftell( fp );
fseek( fp, 0, SEEK_SET );

array_size = file_size / sizeof( struct Person );

スキルアップ/キャリアアップ(JOB@IT)