Ayuda en un programa del bloc de notas

Iniciado por Juan821, 26 Junio 2014, 00:43 AM

0 Miembros y 1 Visitante están viendo este tema.

Juan821

Quiero saber porque luego de llegar a funciones si pasa a la funcion his o cualquiera no pasa nada en vez de imprimirme mi documento

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <stdio.h>
FILE *doc;
using namespace std;
int His();
int Cien();
int Depor();
int Geo();
int c=1;
int main()
{
int s,tot,u=0;
srand(time(NULL));
while (c==1)
{
system ("cls");
printf("Presione cualquier tecla para escoger su categoria");
getch();
s=rand()% 4 + 1;

switch (s)
{
case 1:
{
His();
break;
}
case 2:
{
Cien();
break;
}
case 3:
{
Depor();
break;
}
case 4:
{
Geo();
break;
}
}
}
system ("pause");
return 0;
}

int His()
{
int x,i=1,w;
system ("cls");
printf("\n <===============Su categoria es Historia===============> \n");
printf("\n Presione cualquier tecla para escoger su pregunta \n");
getch();
doc = fopen("D:\prueba.txt","r");
if(doc == NULL)
{
printf("\n error en la apertura del archivo \n");
system ("pause");
return 1;
}
while((w=getc(doc)) != EOF);
{
;
if (w =='\n')
{
printf ("\n");
i=1+1;
}
else printf("%c",w);
}
fclose(doc);
return 0;
}
int Depor()
{
int x,i=1,w;
system ("cls");
printf("\n <===============Su categoria es Ciencias===============> \n");
printf("\n Presione cualquier tecla para escoger su pregunta \n");
getch();
doc = fopen("D:\prueba.txt","r");
if(doc == NULL)
{
printf("\n error en la apertura del archivo \n");
system ("pause");
return 1;
}
while((w=getc(doc)) != EOF);
{
w=getc(doc);
if (w =='\n')
{
printf ("\n");
i=1+1;
}
else printf("%c",w);
}
fclose(doc);
return 0;
}
int Cien()
{
int x,i=1,w;
system ("cls");
printf("\n <===============Su categoria es Deportes===============> \n");
printf("\n Presione cualquier tecla para escoger su pregunta \n");
getch();
doc = fopen("D:\prueba.txt","r");
if(doc == NULL)
{
printf("\n error en la apertura del archivo \n");
system ("pause");
return 1;
}
while(i<=5)
{
while((w=getc(doc)) != EOF);
if (w =='\n')
{
printf ("\n");
i=1+1;
}
else printf("%c",w);
}
fclose(doc);
return 0;
}
int Geo()
{
int x,i=1,w;
system ("cls");
printf("\n <===============Su categoria es Geografia===============> \n");
printf("\n Presione cualquier tecla para escoger su pregunta \n");
getch();
doc = fopen("D:\prueba.txt","r");
if(doc == NULL)
{
printf("\n error en la apertura del archivo \n");
system ("pause");
return 1;
}
while(i<=5)
{
while((w=getc(doc)) != EOF);
if (w =='\n')
{
printf ("\n");
i=1+1;
}
else printf("%c",w);
}
fclose(doc);
return 0;
}



MeCraniDOS

Código (cpp) [Seleccionar]
while((w=getc(doc)) != EOF);

Quita el punto y coma  :rolleyes:

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Flakito81

#2
La verdad es que estoy un poco desentrenado con el C, pero echando una vista rápida veo lo siguente:

1- Al final del while tienes un ';' eso quiere decir que leera el fichero hasta acabar y listo
2-Suponiendo que

.........printf ("\n");
.........i=1+1;

En realidad quiera decir

.........printf ("\n");
.........i=i+1;

Nota: Ver que 1+1 es 2 siempre y no tiene ningun sentido.
2.1- La función His() tiene dos getc ¿para qué?
2.2- Las funciones Cien(), depor(), geo()

while(i<=5)
{
...while((w=getc(doc)) != EOF);
...if (w =='\n')
......{
.........printf ("\n");
.........i=1+1;
......}
...else printf("%c",w);
}

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:
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 ....

printf("Presione cualquier tecla para escoger su categoria");
getch();

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-

if (w =='\n')
{
...printf ("\n");
...i=i+1;
}
else
... printf("%c",w);


Es equivalente a:

printf("%c",w);


En el caso de que estes contando los saltos de linea por alguna razón:

if (w =='\n')
...i++;
else
... printf("%c",w);


5- La lectura del fichero deberá de ser algo como

while((w=getc(doc)) != EOF);
{
...printf("%c",w);
}
fclose(doc);


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:


int Funcion(char *fichero, char *categoria)
{
...int x,i=1,w;
...system ("cls");
...printf("\n <===============Su categoria es %s===============> \n", categoria);
...system("pause");
...doc = fopen(fichero,"r");
/** Resto del código **/


Obviamente la llamada seria tal que:

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