I (think) nmemb stands for: "number of members". Quite arguably, though ;)
The point is you're reading data from stream and writing it into ptr (EDIT: actually you don't write data into ptr; you write it into the location in memory that is pointed to by ptr) (a so called buffer"buffer"). But you'll probably get in trouble if the structure that ptr points to is not big enough to handle all the data retrieved by fread.
So, the designers of fread built into it a tool for you, as a user, to prevent buffer overflows: you "allow" it to read in nmemb items, each of size size (total bytes read = nmemb * size) each time it's invoked.
Such total is the value returned by the function, which you're using to validate your reading process.
EDIT:
Every time you invoke the function, it moves a so-called cursor (EDIT: the cursor is often referred to as the "file position indicator".) from the actual position (initially, the beginning) in the stream (for that's what FILE *file actually is) such total number of bytes ahead. That is, until you decide to fclose() such stream, or until the special symbol EOF ("End Of File") is read, which forces fread() to return.
According to it's man page:
If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).
Such return value is useful in order to determine when you've reached the end of the file, and need to move on in your algorithm.
One more hint regarding your actual implementation: if you defined RGBTRIPLE and BITMAPFILEHEADER as integer constants, e.g.:
#define BITMAPFILEHEADER 10 #define RGBTRIPLE 20 You're probably going to get into trouble.
Those "#" statements are delt with by the preprocessor ("pp"): they're called "preprocessor directives". What the pp does is, simply, replace every occurence of RGBTRIPLE with the value 20 before the compilation. Such value is, in fact, a constant integer.
So, when you execute:
sizeof(RGBTRIPLE); What actually gets executed after the pp replacement is:
sizeof(20); Since 20 is an int, you'll get back the size of the type int as defined in your system (same as what you do with malloc), so the result is (in most systems):
4 which is probably not what you expect.
If you're in doubt, try printing out the value of:
printf("%d\n", sizeof(RGBTRIPLE)); and see what comes out ;)
HTH!