Punteros necesitarás aprender, poo sólo si piensas trabajar en ese paradigma, árboles hay que conocerlos.
Puedes trabajar sobre librerías y en proyectos medianos o que usen gráficos y sonidos e interfaces humanas vas a usar. Pero no está de más que aprendas todas esas cosas que has mencionado.
Cuando adquieres algo por teclado lo que se teclea va a un buffet y getchar devuelve el primer elemento de ese buffer, pero queda lo demás. Cuando tomas un solo carácter en verdad se guardan dos: el dato que quieres y uno de nueva línea '\n', fruto de pulsar ENTER. Puedes solucionar esto vaciando el buffer leyendo todos los caracteres que tiene hasta llegar al de nueva línea, así te aseguras que en la próxima iteración sólo estará el dato que te interesa.
Para aligerar aún más las cosas (a expensas de usar más memoria) te diría que fueras guardando los primos encontrados en una lista dinámica y usaras los elementos de esa lista como divisores del número que estás operando. Si llegas al final de ella ( o superas la raíz cuadrada del número), sin que ningún elemento haya sido divisible por el número, has encontrado el siguiente primo y lo incluyes en la cola de la lista. Así te evitas de realizar muchas operaciones.
La razón de esto es que cuando factorizas, si te das cuenta, usas siempre el menor primo.
Puedes hacerlo de dos formas: 1. Cargar todo el texto en memoria, hacer el añadido y guardarlo todo otra vez. 2. Puedes leer el archivo línea a línea e ir guardando en otro. Donde sea que necesites escribes la información nueva y sigues leyendo del archivo original y guardarlo en el nuevo. Después borras el original y renombras el nuevo.