Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the rationale for fread/fwrite taking size and count as arguments?

Tags:

c

file-io

libc

We had a discussion here at work regarding why fread() and fwrite() take a size per member and count and return the number of members read/written rather than just taking a buffer and size. The only use for it we could come up with is if you want to read/write an array of structures which aren't evenly divisible by the platform alignment and hence have been padded but that can't be so common as to warrant this choice in design.

From fread(3):

The function fread() reads nmemb elements of data, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr.

The function fwrite() writes nmemb elements of data, each size bytes long, to the stream pointed to by stream, obtaining them from the location given by ptr.

fread() and fwrite() return the number of items successfully read or written (i.e., not the number of characters). If an error occurs, or the end-of-file is reached, the return value is a short item count (or zero).

like image 855
David Holm Avatar asked Nov 17 '08 16:11

David Holm


People also ask

What does fread do all day long?

The function fread() reads nmemb elements of data, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr.

How many bytes fread read?

fread(a, 1, 1000, stdin); attempts to read 1000 data elements, each of which is 1 byte long.

Can Fwrite fail?

Yes. The return value should always be count. If it's not - you should use ferror() or feof() to determine whether you've reached the end of the file and/or encountered an error. Ignoring errors and/or unexpected conditions is the stuff from which unreliable software is wrought down on unsuspecting users.

How does C fread work?

The fread() function returns the number of full items successfully read, which can be less than count if an error occurs, or if the end-of-file is met before reaching count. If size or count is 0, the fread() function returns zero, and the contents of the array and the state of the stream remain unchanged.


1 Answers

The difference in fread(buf, 1000, 1, stream) and fread(buf, 1, 1000, stream) is, that in the first case you get only one chunk of 1000 bytes or nothing, if the file is smaller and in the second case you get everything in the file less than and up to 1000 bytes.

like image 78
Peter Miehle Avatar answered Oct 15 '22 00:10

Peter Miehle