Oof. Granted, I think your logic is fine, but rather than go mucking about with this interface can't we just call the advance() or seek() functions?
That has the advantage of making it clearer what the error is on failure: either it happened while reading the file, or it happened while skipping forward because it was short.