私は基本的に次のコードを持っています:
int fileWrite(int file, void * pBuffer, size_t size)
{
size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
if (bytesWritten != size)
{
return -1;
}
return 0;
}
サイズが1GBの場合は機能しますが、サイズが〜2GBの場合、一貫して4Kバイトが残ります。書き込みをループでラップしてバッファを上に移動することでこれを修正できますが、なぜそれが常に失敗するのか知りたいです。
たとえば、サイズが2147483648の場合、書き込みは2147479552のみを書き込み、4096は書き込みません。なぜこれが発生し、書き込みを常にループでラップすることが正しいのですか?
2
32ビットモードで実行していますか?2gigは32ビットの最大数です。
—
Barmar
write
一度に消費するデータ量のルールは、データシンクのタイプfile
(「通常の」ファイル、パイプ、ストリームソケット、データグラムソケットなど)によって異なります。より具体的にできますか?
待って、あなた
—
ルアン
write
はすぐにファイル全体を試していますか?通常のアプローチは、すべてを書き込むまで、一度にバッファサイズのデータをストリーミングすることです。
@Luaanあなたはすでに私はそこのこと何も表示されていないすべてのデータがある場合は間違っをすべてこの質問と回答を示したら、しかしとしてでそれを書くことを、
—
パイプ
write()
(小さすぎるバッファのために行くもの)それをすべてを記述する必要はありません
「書き込みをループでラップすることでこれを修正できます」という
—
アダム
SSIZE_MAX
制限に関係なく、修正する必要があります。write()
仕様では、それはそれはほとんど常にしていても、完全なバッファを書き込むための義務を負いませんと言います。問題のループのないコードはバグです。