On Thu, Jun 18, 2020 at 02:32:02PM +0000, Walter Harms wrote: > >If the requested size is 4 but there are only 3 bytes left then > >fread() will return 0, no matter what's the value of nmemb because > >it's not able to read even a single item and feof() will return > >non-zero. I think that this is explained clearly enough in the > >manpage. > > IMHO i would be more clear to drop that "short item count". > "If an error occurs, or the end of the file is reached, the return value is zero" But the thing is that return value does not have to be zero, at least when the end of the file is reached. Check this: #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp = fopen("/bin/sh", "rb"); if (!fp) { perror("fopen"); return EXIT_FAILURE; } fseek(fp, -10, SEEK_END); unsigned char buffer[12]; size_t ret = fread(buffer, 4, 3, fp); if (ret != 3) { fprintf(stderr, "fread() failed: %zu\n", ret); printf("feof: %d\n", feof(fp) ? 1 : 0); exit(EXIT_FAILURE); } fclose(fp); exit(EXIT_SUCCESS); } Output: fread() failed: 2 feof: 1 > >That is interesting. POSIX > >https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/ says > >that "If a partial element is read, its value is unspecified.". But as > >fread() returns number of items it has successfully read the returned > >value should always be checked and it's different than requested nmemb > >it means an error and I guess there is no way to tell how many bytes > >have been partially read - for example if size == 4 and nmemb == 1 and > >returned value is 0 you don't know if fread() read 1, 2 or 3 bytes. > > the GNU version fills the buffer with the remaining bytes And so does libuClibc-0.9.33.2 and musl 1.1.20-git-79-gd6c855c that I have at hand. It's probably the easiest implementation of fread(). > but returns 0. That's not always the case as I showed above. -- Arkadiusz Drabczyk <arkadiusz@xxxxxxxxxxxx>