15

私は現在コールバック関数を書いていますC:

static size_t writedata(void *ptr, size_t size, size_t nmemb, void *stream){

        size_t written = fwrite(ptr, size, nmemb, (FILE)*stream);
        return written;
}

この関数は、要求を実行し、HTTP要求を取得して、ローカル マシンに書き込む別の関数で使用されます。そのwritedata機能は後半で使用します。全体の操作は でなければならないので、 と の間でmultithreaded迷っていました。との違いの概要を説明してくれる人がいるので、自分の問題に最も適したものを選択できますか?writefwritewrite()fwrite()C

4

3 に答える 3

24

fwriteFILE*、つまり(潜在的に)バッファリングされたstdioストリームに書き込みます。ISO C 規格で指定されています。さらに、POSIX システムでは、ある程度fwriteスレッドセーフです。

writePOSIX 標準で説明されている、ファイル記述子に基づく下位レベルの API です。バッファリングについては知りません。で使用する場合はFILE*、ファイル記述子を でフェッチしますfilenoが、ストリームを手動でロックしてフラッシュしてからwrite.

fwrite何をしているのかわからない場合は使用してください。

于 2012-07-10T13:22:15.933 に答える
0

このwrite関数は、プログラムがオペレーティング システムに対して行う呼び出しであるため、 よりも低速ですfwrite。また、バッファリングの哲学が示唆するように、「大きなファイルよりも小さなファイルの多くの部分を処理する方が速い」ため、バッファリングが不足しているため、さらに遅くなります。が c 標準の一部ではないことも重要ですwrite。そのため、おそらく非 POSIX システムでは見つけられず、(まれに)適切な使用方法が異なります。writeまた、fwrite と fread はandを使用して実装される場合があることも知っておく必要がありますread(簡単な実装については、K&R の Unix に関する章を参照してください)。

もう 1 つの注目すべき点は、とファイル記述子readwrite使用すること ですが、 fread と fwrite は、 実際にはファイル記述子と開かれたファイルに関するその他の情報を含むポインターであるFILE ポインターを使用します。

于 2012-07-13T19:08:46.890 に答える