Ich habe im Wesentlichen folgenden Code:
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;
}
Es funktioniert, wenn die Größe 1 GB beträgt, aber wenn die Größe ~ 2 GB beträgt, bleiben konsistent 4 KB übrig. Ich kann dies beheben, indem ich Write in eine Schleife einschließe und den Puffer nach oben verschiebe, aber ich bin neugierig, warum es immer fehlschlägt.
Wenn die Größe beispielsweise 2147483648 ist, schreibt Write nur 2147479552 und lässt 4096 ungeschrieben. Warum sollte das passieren und ist es richtig, schreiben immer in eine Schleife zu packen?
Läuft es im 32-Bit-Modus? 2gig ist die maximale 32-Bit-Zahl.
– Barmar
10. April 2020 um 18:51 Uhr
Die Regeln für wie viele Daten
write
auf einmal verbrauchen, hängt davon ab, welche Art von Datensenkefile
ist (zB “normale” Datei, Pipe, Stream-Socket, Datagramm-Socket, …). Kannst du genauer sein?– zol
10. April 2020 um 18:52 Uhr
Warte, versuchst du es
write
die ganze Datei auf einmal? Der übliche Ansatz besteht darin, die Daten jeweils um eine Puffergröße zu streamen, bis Sie alles geschrieben haben.– Luan
11. April 2020 um 7:10 Uhr
@Luaan Wenn Sie bereits alle Daten haben, sehe ich nicht, dass es etwas gibt falsch alles auf einmal schreiben, aber wie diese Frage und Antwort zeigt,
write()
muss nicht alles schreiben (was auch für kleine Puffer gilt)– Rohr
11. April 2020 um 16:18 Uhr
“Ich kann dies beheben, indem ich in eine Schleife schreiben” und Sie müssen, unabhängig von der
SSIZE_MAX
Beschränkung. Daswrite()
spec sagt, dass es nicht verpflichtet ist, den vollen Puffer zu schreiben, auch wenn dies fast immer der Fall ist. Der schleifenlose Code in der Frage ist ein Fehler.– Adam
11. April 2020 um 17:58 Uhr