2011-01-16 26 views
1

私はいくつかのファイルのヘッダーを保存すると言うことができますが、ヘッダの一部がダイナミックな長さである、このようなものは、それはなりますC++:動的なデータを構造体にエレガントに読み込む方法は?

struct HeaderTest { 
    int someparam; 
    int more; 
    int arrsize;  // how big array, read arrsize elements into arr: 
    int arr[arrsize]; // not valid 
}; 

は、構造体に動的なデータを読み込むためのいくつかのエレガントな方法はありますか?

+2

どのようなデータですか?あなたはどこから読んでいますか? *「ダイナミックデータ」*とはどういう意味ですか? – Nawaz

+1

'std :: vector'は最後のメンバですか?あなたの質問は、デシリアライゼーションとして「ダイナミック」データを格納することと同じように思えます。 –

+0

arrsizeを知らずに、配列の代わりにintのベクトルを使用できます。 – DumbCoder

答えて

2

あなたがコンテナクラスを使用したくない場合(そうしないとわからない場合)、arrをintへのポインタとして宣言し、それをクライアントに残してポインタを有効なメモリ位置に初期化できますarrsizeを正しく初期化することができます。

つまり、ベクターを使用するだけです。なぜ必要以上に難しいものにするのか?

struct HeaderTest 
{ 
    int someparam; 
    int more; 
    std::vector<int> data; 
} 

ノー編曲、無arrsize:代わりにあなたの構造体のarrarrsize変数を持つの

6

することは、あなたはこのようなあなたの構造体を定義することができます。ちょうどstd::vectorstd::vector::size()を使用してください。それはエレガントです!

し、ファイルからバイナリデータを読みたい場合は、次のように書くことができます。

struct HeaderTest 
{ 
    int someparam; 
    int more; 
    int size; 
    char *data; 
} 

それ以外の場合は、最初のstructで行きます!


アドバイス:

はどこでもあなたのコメントを読んで、私はあなたが良い本を入手することをお勧めし、それを最初に勉強するべきだと感じています。ここで本当に良い本のリストは、次のとおりです。

The Definitive C++ Book Guide and List

+1

データの長さを知っていないと、その構造体にファイルデータをどのように読み込みますか? – Newbie

+0

-1バイナリデータをベクトルに読み込むことはできません。 –

+0

@Newbie:ファイルデータを読み込み、push_backを 'data.push_back(file_data_int)'のようにベクトルに読み込むことができます。 – Nawaz

0

私は非常にエレガントな方法があるとは思いません。その動的メンバーをポインタにしてから、他のすべてのメンバーを先に読み込み、最後のメンバーにメモリを割り当ててから、残りのデータを読み込む必要があります。

あなたはC++を使用しているので、これをクラスにうまくカプセル化して、コードのこの詳細をもう心配する必要はありません。また、他の人が言ったように、std::vectorは、単純なポインタと手動で割り当てられたメモリよりもC++のようなアプローチになります。また、メモリリークにも強くなります。

+0

"これをクラスにうまくカプセル化することができます"という意味は分かりませんが、1行のコードを読み込んで、自動的にarrsize要素のベクトルを割り当ててそこの要素を読み込むことができますか?これは他の構造体でもうまくいくでしょう(ほとんどまたはまったく)?あなたはこのクラスメソッドがある場合、いくつかの例を表示できますか? – Newbie

+0

なぜ「1行のコード」が要件ですか? –

+0

1行では、すべての構造体に対して手動で自分のリーダー関数を分割する必要がないメソッドを意味します。私は、structを書いてfread()を呼び出す何らかの方法があれば、必要な割り当てをすべて行い、structを使用する準備が整ったと思っていました。 – Newbie

1

この回答はC++よりもCですが、realloc()を使用して必要な大きさにバッファのサイズを変更することは簡単にできます。この擬似コードで実証されているように。

struct HeaderTest { 
    int someparam; 
    int more; 
    int arrsize; 
    int arr[]; 
}; 

HeaderTest* pkt = (HeaderTest*)malloc(sizeof(HeaderTest)); 
read(&pkt,sizeof(pkt)); 
pkt = (HeaderTest*)realloc(pkt,sizeof(HeaderTest)+sizeof(pkt->arr[0])*pkt->arrsize); 
read(pkt->arr,sizeof(int)*pkt->arrsize); 
+0

'int arr [];は許可されていますか? – Nawaz

+3

はい。 []は、誰がサイズを知っていないかを示す配列を示し、構造体の最後の要素になります。 –

0

誰もあなたが望む解決策を提供できませんでしたが、私はあなたのためにそれを考案しました。 この関数は、C文字列のファイル名をとり、ファイルを開き、内容を読み取ります。 t.containerに割り当てることができるint *を返します。楽しい。

int* read(char* filename) 
{ 
    // open file 
    ifstream f; 
    f.open(filename, ios::binary); 
    // get file size 
    f.seekg (0, ios::end); 
    int length = f.tellg(); 
    f.seekg (0, ios::beg); 
    // allocate new int* 
    length = (length -(sizeof(int)*2))/sizeof(int); 
    int* buf = new int[length]; 
    for(int i = 0; i < length; ++i) 
    { 
     // create byte array to hold bytes 
     unsigned char* temp = new char[sizeof(int)]; 
     stream.read((char*)temp, sizeof(int)); 
     // convert byte array to int 
     for(int j = 0; j < sizeof(int); ++j) 
     { 
      buf[i] = buf[i] + (temp[j] << (j*8)); 
     } 
     delete[] temp; 
    } 
    f.close(); 
    return buf; 
} 
関連する問題