• ベストアンサー

fwrite(3)の第2,第3引数の使い方

man fwrite(3) を見ると、宣言は以下のようになっています。 size_t fwrite(const void *BUF, size_t SIZE, size_t COUNT, FILE *FP); 「BUF から、1つあたり SIZE byte を COUNT 個 FP に書き込む」という関数だと思うのですが、SIZE と COUNT 値はどう指定したらよいのでしょうか? たとえば、char BUF[1024] で全部書き込みたい場合に、SIZE = 1, COUNT = 1024 と指定するのと、SIZE = 4, COUNT = 256 と指定するのでは、書き込み速度や結果に違いが出るのでしょうか?

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

ライブラリの実装しだいでは、書き込み動作自体にも違いが出る可能性がなくもないかと思います。現実に違うことはほとんどないと思いますが... 速度的な違いは、多くの場合、乗除算の速度に依存する気がします。乗除算器を持たないプロセッサや、あっても貧弱なためにC言語の演算を実現できない場合には、ソフト的に計算しますので、オペランドの値によって計算にかかる時間が変わります。

tthe_mine
質問者

補足

回答ありがとうございます。 「動作自体に違いが出る」というのは、結果としてできあがるファイルが異なるということでしょうか? できあがるファイルが異なる場合、どのようなファイル内容になることがあり得ますか?

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#2です。 > 「動作自体に違いが出る」というのは、結果としてできあがるファイルが異なるということでしょうか? 実際そのような実装があるかどうかは知りませんが... 例えば、要素の書き込みごとに排他制御を行っているような実装であれば、複数のタスクから同じファイルに書き込んだ場合、できあがるファイルの内容が異なる可能性はあるかと思います。 標準Cの規定では、マルチタスク環境のことが考慮されていませんから、排他制御の方法は完全に実装依存になります。

  • koko_u
  • ベストアンサー率12% (14/116)
回答No.1

ソースを見ると、ファイルへの書き込みは SIZE * COUNT バイト書いているだけなので、書き込み結果は同じ。 ただし、戻り値は SIZE 単位で何個書き込めたかが返ってくるので後者の場合は全て書き込めた場合には 256が返ってくる。 まぁ、fwrite( (const void*)BUF, sizeof(char), 1024, fp ) という風に BUF の要素のサイズを第2引数に、配列のサイズを第3引数にするのが常識的対応か?

tthe_mine
質問者

補足

なるほどー。 よろしかったら、参照したライブラリの名前とバージョンを教えていただけませんか?

関連するQ&A