开发者

How to read unsigned short from file?

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.


std::ifstream input("inputfile.txt");  
unsigned short value;  
input >> value;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜