すみませんが少々お力添えをいただけますでしょうか。

コンパイラはVC8で, cl code.cppとコンパイルしています。

現在とある画像ファイル形式(パレット方式、\0をランレングス圧縮)を
BMPに変換するコードを書いているのですが、

byte *cdata = new byte[ihead.length];

ifs.read(reinterpret_cast<char*>(cdata),ihead.length);

if(!ifs){
  cout << "file read failed" << endl;
  return 0;
}
string data = Decode(cdata,ihead); // \0をデコード

delete[] cdata;

この流れで ihead.length==655 にもかかわらず、
ifs.tellp() で読み込みバイト数を調べると、 7000 バイトも読み込んでいるようなのです。
Decode 内で cdata を全て表示させて、ファイルと比較してみたところ、
読み込み位置が 639 バイト目から突然 4000 バイト以上後方にジャンプしていました。

seekg したわけでもないのに read 中にファイル読み込み位置がずれることはあるんでしょうか。