Código (cpp) [Seleccionar]
int palabras_found=0;
// ...
arch.write((char *)palabras_found,sizeof(int));
¿por qué motivo tratas palabras_found como si fuese un puntero? Me da que no terminas de entender el significado y funcionamiento de los punteros.
En este caso concreto, "palabras_found" no es puntero, y dado que la función "write" necesita un puntero, lo que tienes que facilitarle a la función es la posición de memoria donde se encuentra "palabras_found", es decir:
Código (cpp) [Seleccionar]
arch.write((char *)&palabras_found,sizeof(int));
Lo que tu estabas almacenando antes en el fichero era guarrería... además le estabas dando al sistema operativo motivos más que suficientes para que matase tu programa por acceder a memoria que no le corresponde.