eof
устанавливается только после сбоя чтения, поэтому чтение выполняется дважды, и во второй раз буфер не изменяется.
Попробуйте это:
while(filin.read((char*)&tmpStu,sizeof(tmpStu)))
{
cout << tmpStu.rollNo << endl;
}
или
while(!filin.read((char*)&tmpStu,sizeof(tmpStu)).eof())
{
cout << tmpStu.rollNo << endl;
}
Read возвращает ссылку на filin при вызове, которая оценивается как true, если поток все еще исправен. Если при чтении не удается прочесть больше данных, ссылка оценивается как ложная, что не позволяет ей войти в цикл.