How do I read an integer from a binary file using fread?

user3081405 picture user3081405 · Mar 3, 2014 · Viewed 17.7k times · Source

I've realized that my much bigger file is failing because it can't properly read the first integer in a binary file. This is my test file I've set up to do only that. I know that the int I'm reading will always be 1 byte so I read the data into a char and then cast it as a short. It got this working at some point in the past but I somehow messed it up when cleaning up my code.

At this point the program is printing

"The integer is 127"

When it should be printing

"The integer is 1"

Does anybody know why this may be?

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h> 
#include <string.h>

int main(int argc, char *argv[]){
    FILE *inp;
    char r;
    short i;

    if ((inp = fopen(argv[0],"r")) == NULL){
    printf("could not open file %s for reading\n",argv[1]);
    exit(1);}

    fread((void *)&r,(size_t) 1,(size_t) 1, inp);
    i = (short)r;

    printf("The integer is %d\n",i);        
}

Answer

Fiddling Bits picture Fiddling Bits · Mar 3, 2014

You should call fread like this to read an int:

int num;
fread(&num, sizeof(int), 1, inp);

Also, it would be wise to check the return value which, if successful in your case, should be 1:

#incude <errno.h>
errno = 0;
if(fread(&num, sizeof(int) 1, inp) != 1)
    strerror(errno);

Edit

If the value you're reading is only 8 bits, you should use unsigned char to read it like so:

unsigned char num;
fread(&num, 1, 1, inp);