Mam zasadniczo następujący kod:
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;
}
Działa, jeśli rozmiar wynosi 1 GB, ale gdy rozmiar wynosi ~ 2 GB, konsekwentnie pozostaje 4K bajtów. Mogę to naprawić, owijając zapis w pętli i przesuwając bufor w górę, ale jestem ciekawy, dlaczego zawsze zawodzi.
Na przykład, jeśli rozmiar to 2147483648, tylko do zapisu zapisuje 2147479552, pozostawiając 4096 niepisany. Dlaczego tak się dzieje i czy poprawne jest zawsze zawijanie zapisu w pętli?
writezostanie zużyte jednocześnie, zależą od typu ujścia danych file(np. „Zwykły” plik, potok, gniazdo strumienia, gniazdo datagramu, ...). Czy mógłbyś to sprecyzować?
writejednocześnie otworzyć cały plik? Zwykle stosuje się przesyłanie strumieniowe danych wielkości bufora na raz, dopóki nie napisze się wszystkiego.
write()nie musi to wszystko (co idzie do małych buforów zbyt) napisać
SSIZE_MAXograniczeń. write()Spec mówi, że nie ma obowiązku, aby napisać cały bufor, nawet jeśli jest prawie zawsze. Kod bez pętli w pytaniu jest błędem.