1- Al final del while tienes un ';' eso quiere decir que leera el fichero hasta acabar y listo
2-Suponiendo que
Código
En realidad quiera decir
.........i=1+1;
Código
Nota: Ver que 1+1 es 2 siempre y no tiene ningun sentido.
.........i=i+1;
2.1- La función His() tiene dos getc ¿para qué?
2.2- Las funciones Cien(), depor(), geo()
Código
Si analizas un poco ese código veras que hace la primera iteración porque i<=5, i = 1. Luego leerá todo el fichero hasta el final y pueden ocurrir dos cosas:
while(i<=5) { ...if (w =='\n') ......{ .........i=1+1; ......} }
a) Que hacen menos de 5 saltos de linea y vuelva a iterar para leer un fichero cuyo puntero está al final
b) Que hayan 5 o mas saltos de linea y no haga nada
En cualquiera de los casos no tiene sentido
3- Hay variables que no se usan
4- Usas C, pero tienes cabeceras y espacios de nombres del C++. Deberias de decidir en que lo vas ha hacer.
5- conio.h es lo peor de lo peor. Exceptuando que te obliguen a usar algún compilador obsoleto como Turbo C no deberias de emplearla.
Consejos:
1- Ya que estas usando llamadas al sistema ....
Código
Sustituyelo por un system("pause"); si quieres adecua el mensaje para que tenga sentido
2- Cuando ejecutes el programa hazlo desde la consola y no desde el compilador así cuando acabe la ejecución no perderas la ventana del entorno y puedes evitar algunos "pause"
3- Al menos hasta que no sepas que te funciona correctamente coloca los ficheros en la misma carpeta donde se encuentre el ejecutable
4-
Código
if (w =='\n') { ...i=i+1; } else
Es equivalente a:
Código
En el caso de que estes contando los saltos de linea por alguna razón:
Código
if (w =='\n') ...i++; else
5- La lectura del fichero deberá de ser algo como
Código
{ }
6- Imaghino que al hacer el codigo te habras dado cuenta que las funciones son muy parecidas, por no decir iguales, a excepcion del fichero que abres. La prueba es que hiciste una y el resto es un copia pega. Mi propuesta es que no te compliques que trabajes lo menos posible siempre que puedas, que simplifiques las cosas.
Haz una sola funcion a la que le pases el nombre del fichero y la llames las veces que necesites con el argumento (nombre del fichero) necesario.
La funcion quedaría tal que:
Código
int Funcion(char *fichero, char *categoria) { ...int x,i=1,w; /** Resto del código **/
Obviamente la llamada seria tal que:
Código
Funcion ("historia.txt", "Historia");
Y por supuesto se puede hacer más profesional, pero siempre hay que empezar por lo básico la experiencia es lo que necesitas
En realidad tampoco te puedo decir mucho más porque no sé que quieres hacer ni cual va a ser la escructura del fichero ni nada