Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read unsigned short from file?

Tags:

c++

c

file-io

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.

like image 906
101010110101 Avatar asked Dec 05 '22 04:12

101010110101


2 Answers

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
}
like image 70
wallyk Avatar answered Dec 07 '22 18:12

wallyk


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.

like image 42
Alex Budovski Avatar answered Dec 07 '22 18:12

Alex Budovski