0

fwrite では、構造体全体を書いていますか? 私たちはf1とf2にいますか?どんな助けでもいただければ幸いです

typedef struct {
    int field1;
    int field2;
}mystruct;

int main(int argc,char *argv[])
{

    int size=2;
    mystruct structarray [size];
    int i=0;
    for (i=0;i<size;i++)
    {
        structarray[i]=calloc(1,sizeof(mystruct));
    }

    FILE *F1;
    if (fopen("structfile","wt")==NULL){
        err_sys("cannot be opened");
    }

     i=0;
    for (i=0;i<size;i++)
    {
        structarray[i].field1=i;
    }

    fwrite(structarray[0].field1,sizeof(mystruct),size,F1);
    fclose(F1);
}
4

2 に答える 2

1

structarray[0].field1は ですintが、の最初の引数はfwriteですvoid*。使用する

fwrite(structarray, sizeof(mystruct), size, F1);

または、私は好む

fwrite(structarray, sizeof *structarray, size, F1);

の型に結合されていないため、結合をstructarray減らすことは良いことです。あなたはただすることさえできます

fwrite(structarray, sizeof structarray, 1, F1);

structarrayポインタではなく、本当に配列である限り。

の戻り値を確認する必要がありfwriteます。そして、警告レベルを高く設定してコンパイルします...コンパイラは、 to を渡そうとしたことについて警告する必要がありintますfwrite

structarray[i]=calloc(1,sizeof(mystruct));

これは正当ではありません ... ですstructarray[i]mystructcallocポインターを返します。質問の下にある aardvarkk のコメントを参照してください。また、設定せずに F1 を使用したことも通知されます。

于 2013-02-28T16:08:06.640 に答える
1

概念的には、あなたのアプローチは機能します。ただし、コードにはいくつかの問題があります。

(1)structarrayは自動変数として宣言されます (スタック上に割り当てられます)。calloc()各配列要素を呼び出す理由はありません。配列はすでに完全に割り当てられています。おそらく、配列要素 (memset()など) を初期化するつもりだったのでしょう。

(2)fopen()は開かれたファイルへのポインタを返しますが、戻り値を に代入していませんF1。その結果、F1は初期化されないままになるため、 への呼び出しfwrite()は機能しません。

(3) (特定の要素ではなく) 構造体の配列全体をファイルに保存する場合は、呼び出しをfwrite()次のように変更します。

fwrite(structarray, sizeof(mystruct), size, F1);

(4) からの戻り値を常にチェックしfwrite()て、成功したことを確認します。

于 2013-02-28T15:59:24.543 に答える