重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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 と指定するのでは、書き込み速度や結果に違いが出るのでしょうか?

A 回答 (3件)

ライブラリの実装しだいでは、書き込み動作自体にも違いが出る可能性がなくもないかと思います。

現実に違うことはほとんどないと思いますが...

速度的な違いは、多くの場合、乗除算の速度に依存する気がします。乗除算器を持たないプロセッサや、あっても貧弱なためにC言語の演算を実現できない場合には、ソフト的に計算しますので、オペランドの値によって計算にかかる時間が変わります。

この回答への補足

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

補足日時:2007/01/26 10:28
    • good
    • 0

#2です。



> 「動作自体に違いが出る」というのは、結果としてできあがるファイルが異なるということでしょうか?

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

ソースを見ると、ファイルへの書き込みは SIZE * COUNT バイト書いているだけなので、書き込み結果は同じ。


ただし、戻り値は SIZE 単位で何個書き込めたかが返ってくるので後者の場合は全て書き込めた場合には 256が返ってくる。

まぁ、fwrite( (const void*)BUF, sizeof(char), 1024, fp ) という風に BUF の要素のサイズを第2引数に、配列のサイズを第3引数にするのが常識的対応か?

この回答への補足

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

補足日時:2007/01/26 05:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!