0

C を使用してバイナリ ファイルを読み書きするときはいつでも、 fread()andfwrite()関数を使用します。パラメータとして、読み取りまたは書き込み中のデータのバイトが必要なので、sizeof()関数を使用します。問題は次のとおりです。

本には、次のような関数を宣言する必要があると書かれています。

fread(&variable,sizeof(TYPE_OF_VAR),quantity,file);

私は次のステートメントを使用しましたが、ほとんどの場合は機能しますが、常に機能するとは限りません。

fread(&variable,sizeof(VARIABLE),quantity,file);  

うまくいくときとうまくいかないときがあるのはなぜですか?変数の(int、charなど)
に依存しますか?使用するデータムの によって異なりますか?

4

3 に答える 3

2

心に留めておくべきことsizeofは、コンパイラがコンパイル時に型について知っていることに基づいているということです (現時点では VLA を無視します)。変数を指定すると、その変数の型が使用されます。

したがって、期待どおりに機能しない場所を考えることができるのは、ポインターを使用する場合だけです。

基本的には、次のようになります。

int x[5];
int *y = &x[0];
int *p = malloc(sizeof(int) * 5);
sizeof(x); // == sizeof(int) * 5
sizeof(y); // == sizeof(int *)
sizeof(p); // == sizeof(int *)

これは、関数に渡されると配列がポインターに減衰するため、関数を扱うときに注意が必要です。また、これらの 3 つすべてがまったく同じであることに注意してください。

int func(int *p);
int func(int p[5]);
int func(int p[]);

3つすべてにおいて、 p は配列ではなくポインタです。

于 2012-08-05T22:37:14.447 に答える
1
于 2012-08-05T22:42:11.610 に答える
0

それは常に機能します。

int main()
{
    char a[10];
    int b[10];
    printf("%d %d %d %d %d %d",sizeof(char),sizeof(int), sizeof(a),sizeof(b), sizeof(a[0]), sizeof(b[0]) );
}

上記のコードを試してください。表示されるはずです(コンパイラによって異なりますが、文字は1バイト、整数は4バイトです)1,4,10,40,1,4

freadやfwrite、またはどこで使用する場合でも違いはありません。

于 2012-08-05T22:38:52.040 に答える