2

ハードディスクが 100% いっぱいの場合、fwrite(たとえば 1000 バイト) は 0 を返します [失敗、予想どおり]。ただし、ハードディスクに空き容量がほとんどない場合は 600 バイトとします。その後、fwrite (1000 バイト) は 0 を返しません [失敗] としますが、300 を返します。バイト、再び fwrite を呼び出すと 300 バイトが返されますが、100 回呼び出しても fwrite は決して失敗しませんか?

エラー番号は 28 に適切に設定されています。私の質問は、なぜ fwrite の動作ですか? これは正しいですか?fwrite が書き込みたいバイト数より少ない場合、これはディスクがいっぱいであることを意味しますか?

この状況を処理するための提案はありますか?

4

2 に答える 2

3

fwriteのマニュアルページから:

成功するfread()と、fwrite()読み書きされたアイテムの数を返します。この数値は、size が 1 の場合にのみ転送されるバイト数と同じです。エラーが発生した場合、またはファイルの最後に到達した場合、戻り値は短いアイテム カウント (またはゼロ) です。

そのため、短い書き込みはエラーを示しているerrnoため、書き込みが完了しなかった理由を確認する必要があります。を参照した後errno、Mat の回答は説明します (そして、C 標準は、indeterminateという用語を使用することを除いて、基本的に同じことを言っています)。

于 2013-05-12T15:27:28.033 に答える
1

POSIXはこれについて次のように述べていfwriteます:

エラーが発生した場合、ストリームのファイル位置インジケータの結果の値は指定されていません。

これはfwrite、同じストリームで同じことを繰り返すと、コード内でエラーになることを意味します。ストリームがどこに配置されているかわからないため、ストリームに書き込もうとすることはまったくお勧めできません。

すでに行っているようにこれを処理します。errno短い後にチェックfwriteし、アプリケーションに適したものを何でも実行します。

于 2013-05-12T14:33:43.607 に答える