Here's what I'd do... first grade debugging. Add in these diagnostic lines: void PPDict1::getData(int position, int size, unsigned char *buffer) { int fsize = getDataLength(); if ((position + size) > fsize) { memset(buffer, 0, size); return; } int tinx=(position-getIndexOffset())+size; // Which of these things has the unexpected value? assert(tinx >= 0); assert(getIndexSize() >= 0); assert(getIndexOffset() >= 0); bool const haveMoreTinx = tinx < getIndexSize(); bool const isPtrNonZero = indexPTR_ != 0; std::cerr << tinx << " := (" << position << " - " << getIndexOffset() << ") + " << size; std::cerr << haveMoreTinx << " := " << tinx << " < " << getIndexSize() << '\n'; std::cerr << isPtrNonZero << " := " << indexPtr_ << " != 0\n"; std::cerr << haveMoreTinx << " && " << isPtrNonZero << '\n'; if((tinx<getIndexSize())&&(indexPTR_!=0)){ inxcount_++; void * tPtr=indexPTR_+position-getIndexOffset(); memcpy(buffer, tPtr, size); }else{ dictStream_.seekg(position); dictStream_.read((char *)buffer, size); profcount_++; } } HTH, --Eljay