简体   繁体   中英

Reading from binary after x bytes in C

I am trying to read double values from a binary in C, but the binary starts with an integer and then the doubles I am looking for. How do I skip that first 4 bytes when reading with fread()? Thanks

Try this:

fseek(input, sizeof(int), SEEK_SET);

before any calls to fread .

As Weather Vane said you can use sizeof(int) safely if the file was generated in the same system architecture as the program you are writing. Otherwise, you should manually specify the size of integer of the system where the file originated.

You can use fseek to skip the initial integer. If you insist on using fread anyway, then you can read the integer first:

fread(ptr, sizeof(int), 1, stream) .

Of course you have to declare ptr before calling fread .

As I said, fseek is another option:

fseek(stream, sizeof(int), SEEK_SET) .

Beware that fseek moves the file pointer in bytes (1 in the given line from the beginning of the file); integer can be 4 or other number of bytes which is system specific.

Be careful when implementing things like this. If the file isn't created on the same machine, you may get invalid values due to different floating point specifications.

If the file you're reading is created on the same machine, make sure that the program that writes, correctly address the type sizes.

If both writer and reader are developed in C and are supposed to run only on the same machine, use the fseek() with the sizeof(type) used in the writer in the offset parameter.

If the machine that writes the binary isn't the same that will read it, you probably don't want to even read the doubles with fread() as their format may differ due to possible different architectures.

Many architectures rely on the IEEE 754 for floating point format, but if the application is supposed to address multi-platform support, you should make sure that the serialized format can be read from all architectures (or converted while unserializing).

Just read those 4 unneeded bytes, like

void* buffer = malloc(sizeof(double));
fread(buffer,4,1,input); //to skip those four bytes

fread(buffer,sizeof(double),1,input); //then read first double =)
double* data = (double*)buffer;//then convert it to double 

And so on

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM