Con las citas del estándar C++:
Cita: app -> seek to end before each write
Va a posicionar el cursor al final del archivo antes de cada escritura.
En tu caso, por ejemplo, no importa a dónde quieras posicionar el cursor antes de escribir (con f.seekp(0, f.beg);) porque de todos modos, todos y cada uno de los bytes que quieran escribirse, van a ir al final del archivo.
Cita: ate -> open and seek to end immediately after opening
Inmediatamente después de la apertura va a posicionar el cursor al final del archivo, pero a diferencia del modo
app es posible escribir en cualquier posición.
Puedes usar dos modos para open, dependiendo de si el archivo existe o no. Al abrir un archivo existente, si no quieres destruir su contendido deberás abrirlo en modo
in|out. Por otro lado, si el archivo no existe, al abrirlo con
out crearás uno nuevo.