My program is supposed be reading a table that has two numbers: 4 byte integer to the start of the data within the file, and 4 byte integer of the data's size. The file looks like this (in hex) in the problem area:
I call the same function twice, void IO_Read32(std::ifstream &s, unsigned int &x);Code:0D000000 48050100
Code:IO_Read32(infile, data_off);
IO_Read32(infile, data_size);
The cout line is for debugging, I had originally thought I had seek()'d one byte too far. This is not the case, as that line revealed. The program writes:Code:void IO_Read32(std::ifstream &s, unsigned int &x)
{
unsigned char c;
int i;
x = 0;
for(i = 0; i < 4; ++i)
{
std::cout << "Now at " << s.tellg() << std::endl;
s >> c;
x |= c << (i * 8);
}
}
Notice the lack of byte 5171582! It doesn't read that byte, causing all of the following reads to be one byte off. Why?Code:Now at 5171581
Now at 5171583
Now at 5171584
Now at 5171585
Now at 5171586
Now at 5171587
Now at 5171588
Now at 5171589
The first byte is a 0x0D, so I was thinking newlines, but the file is opened for binary input. (It's not a text file.) I open the file:
infile.is_open() returns true afterwards. Does this have something to do with the way I'm reading the file, and is there some better way to do single byte reads?Code:infile.open(filename.c_str(), std::ios::binary | std::ios::in);