I have a bitmap image that I am parsing and I need to be able to open the file and store the first unsigned short.
I tried to accomplish this using FILE and fscanf() but fscanf() always fails and returns 0 (number of items successfully read).
FILE *pFile = fopen ( fileName->c_str() , "r" );
if ( pFile == NULL )
{
cerr << "couldn't open file ; exiting..." << endl;
exit(0);
}
unsigned short seed;
fscanf (pFile, "%hu", &seed);
Does anyone know of another approach I could take (possibly ifstream?) or maybe could just give me some pointers? Any help would be greatly appreciated.
Thank you.
Don't use the formatted functions like *scanf; they expect character representations of the data, the complement of the *printf functions which translate values into character representations.
unsigned val;
f = fopen (filename, "rb");
if (fread (&val, 1, sizeof (val), f) != sizeof (val))
// error
The biggest caveat of this is how the file was written. If the endianness of the writer is different than the computer this runs on, then explicit endian code should be used instead:
unsigned val;
unsigned char buf[2];
f = fopen (filename, "rb");
if (fread (buf, 1, sizeof (buf), f) != sizeof (buf))
// error
else {
// val = (buf [0] << 8) | buf [1]; // for big endian written file
val = (buf [1] << 8) | buf [0]; // for little endian written file
}
Ahh! No! fscanf is for text! %hu
will look for strings like "1234" in a file, not the actual bytes!
Use fread.
E.g.
FILE *fp = fopen("foo", "rb");
unsigned short x;
fread(&x, sizeof x, 1, fp);
Indeed, watch out for endianness, and open the file in binary. "rb"
to be safe on Windows. Check return codes, etc.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With