• ベストアンサー

fread()関数とfwrite()関数について

fread(void *バッファ,site_t サイズ,size_t 数値,FILE *ストリーム)のようなものがありますが「サイズ」と「数値」とはどのように求めるのでしょうか。 あと、void型のポインタのことがわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

例えば char data[100] ; とした data 全部をfreadで読む/fwriteで書く場合 バッファはdataの先頭なので data でいいです。型をあわせるために (void *)data と書いてもよいでしょう。 サイズは data の一個一個の大きさです。char型なので sizeof(char) になります。 数値はその個数なので、宣言から 100 になります。 例えば int data2[1000]; の200番目から30個に読み込むなら fread( & ( data2[200] ) , sizeof(int), 30 , fp ); ですし short s ; に読みこむなら、sの領域に1個読み込む、と考えて fread( &s , sizeof(short), 1, fp ); です。

takuguard4
質問者

補足

ありがとうございました。 たとえば、という話がとてもわかりやすくて 理解できました。

その他の回答 (3)

  • pdragon
  • ベストアンサー率35% (5/14)
回答No.4

質問の"サイズ"/"数値"の表現を使うと、一般には、 サイズ:オブジェクトのサイズ(バイト数) 数値:オブジェクトの個数 です。 注意すべきは、fread/fwriteは戻り値として実際に読み書きしたオブジェクトの個数を返すということです。 100Byteのcharの配列の読み書きを行う場合、 char buf[100]; int n = fread(buf, 1, sizeof buf, fp); とすると、nはsizeof bufより小さな値が返る事があり、続きから再度読み込む処理が必要になります。 int n = fread(buf, sizeof buf, 1, fp); とすると、戻り値で1(成功)か0(失敗)を判断することができます。

takuguard4
質問者

お礼

ありがとうございました!

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

どこから始まる 大きさいくつの領域を 何個分 読むか、を指定します。 大きさいくつ、がサイズに、何個分、が数値に、それぞれ相当します。 どこから始まる、というのは何かのアドレスを示すのですが、 どんな型のアドレスにも対応できるよう、void *となっています。 char *やint *に決めうちするわけにはいきませんからね。

回答No.1

void*とは「どんな型へのポインタでもOK」というものです。 つまり int*でもchar*でも何でもいいですよと言う意味です。 サイズは通常sizeofを使用します。 数値は、特に何も考えなければ 1 でよいのではないでしょうか?

関連するQ&A

専門家に質問してみよう