Я не вижу, как может работать ваш цикл while (). В общем, вы не должны проверять eof (), а вместо этого проверять, сработала ли операция чтения.
Следующий код записывает запись в файл (который должен существовать), а затем перезаписывает его:
#include <iostream>
#include <fstream>
using namespace std;
struct P {
int n;
};
int main() {
fstream file( "afile.dat" , ios::binary|ios::out|ios::in);
P p;
p.n = 1;
file.write( (char*)&p, sizeof(p) );
p.n = 2;
int pos = 0;
file.seekp(pos, ios::beg);
file.write( (char*)&p, sizeof(p) );
}