2012-03-13 4 views
0

私の構造体配列をバイナリファイルに書き込む関数を記述しようとしています。
私は一度に完全なユニットとして1つのアレイとしてそれをコピーすることができたと思ったが、それは私のために働いていない。バイナリファイルとそれらへの構造

個々のサブエンティティを記述する必要があるのですか、それとも大規模な集まりで処理する方法がありますか?

あなたが実際にあなたが、エラー が何であるかを述べる(あなたが助けを求めるしようとしているとき、これは非常に重要です)しかし、あなたは構造内のポインタのようなものを持っていない提供していない
{ 

     void export_binary(char *data_base_name, student_record *ptr,int array_flag,unsigned int rec_cnt) 
    { 
     if (array_flag==-99) 
      { 
       printf("\n\nDatabase not loaded...\n\nPlease IMPORT or CREATE a new database.\n\n"); 
       system("pause"); 
       return; 
      } 

    int rec_counter; 
    FILE *pf; 

     pf=fopen(data_base_name,"wb"); 

     if (!pf) 
      { 
       printf("*** FILE OPENING ERROR ***\n\n"); 
       system("pause"); 
       return ; 
      } 
     for (rec_counter=0; rec_counter <= rec_cnt; rec_counter++) 
      { 
       fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf); 
      } 


       if ((fclose(pf))!=0) 
      { 
       printf("\n\n*** FILE Error - Closing file FAILED! ***\n\n"); 
       system("pause"); 
       return; 
      } 
       printf("\n\n*** Database SAVED ***"); 
       system("pause"); 
       return; 
} 
+0

追加情報:私のレコードの要素はそれに含まれていますが、それ以外のものは不要です。メインから関数への構造体ポインタを渡しています... student_record * ptr –

答えて

2

for (rec_counter=0; rec_counter <= rec_cnt; rec_counter++) 
{ 
    fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf); 
} 

をして:置き換えることにより、一度にすべてでそれを行うことができます

int actual = fwrite (ptr, sizeof(student_record), rec_cnt, pf); 
if (actual != rec_cnt) ... a problem occurred. 

(あなたがすべき常に戻り値を確認してください)。

だから、各構造体の各要素を別々に配列に書き込む必要はありません。それ以外の方法で1つのヒットで配列全体を書き込むことができます。あなたの追加情報に関しては


私はそれで私のレコードの要素が、他のすべてのためにゴミを持っているファイルを取得します。

はい、入力したレコードより多くのレコードを書き出すとします。つまり、rec_cntが、配置した配列要素の数ではなく配列のサイズである場合、最後には迷惑メールがあります。

私は(恐らく間違って)rec_cntが占有された要素の数であると仮定していました。その値をどこかに持つ変数(rec_cntでない場合)が必要です。それ以外の場合は、どの要素がうまくいくのか、どの要素がゴミであるのかわからないからです。

の変数を使用して、書き込む要素の数をfwriteに設定します。それは内の各要素のゴミである後配列要素ではない、むしろ未使用スペース場合


、それが期待とは無関係です。構造体は、整列のために(そして最後に)パディングを持つことができます。

書き込みと読み取り時に同じパディングがある場合は、無視しても問題ありません。

アライメントが異なる場合があります場合は、はい、あなたはおそらく必要がありますいずれかに:構造用

  • オフパディング(例えば#pragma packとして実装定義のサポート);または
  • 構造体のフィールドを個別に書き出して、パディングを削除します。
+0

ありがとうございます –

関連する問題