Ayuda en programa con ficheros!

Iniciado por Juan821, 25 Junio 2014, 20:01 PM

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

Juan821

Tengo un problema con este codigo
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");
cout<<"Presione cualquier tecla para escoger su categoria"<<endl;
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");
cout<<"<===============Su categoria es Historia===============>"<<endl;
cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
getch();
doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
while(i<=5)
w=getc(doc);
if (w =='\n') printf ("\n");
else
printf("%c",w);
fclose(doc);
return 0;
}
int Depor()
{
int x,i=1,w;
system ("cls");
cout<<"<===============Su categoria es Ciencia===============>"<<endl;
cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
getch();
doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
while(i<=5)
w=getc(doc);
if (w =='\n') printf ("\n");
else
printf("%c",w);
fclose(doc);
return 0;
}
int Cien()
{
int x,i=1,w;
system ("cls");
cout<<"<===============Su categoria es Deportes===============>"<<endl;
cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
getch();
doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
while(i<=5)
w=getc(doc);
if (w =='\n') printf ("\n");
else
printf("%c",w);
fclose(doc);
return 0;
}
int Geo()
{
int x,i=1,w;
system ("cls");
cout<<"<===============Su categoria es Geografia===============>"<<endl;
cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
getch();
doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
while(i<=5)
w=getc(doc);
if (w =='\n') printf ("\n");
else
printf("%c",w);
fclose(doc);
return 0;
}



El problema en la ejecución es este



[MOD] para publicar código, usa la etiqueta GeShi correspondiente. Gracias.

Debes poner titulos descriptivos del tema, "Ayuda!" no lo es, leete las Reglas del Foro.


eferion

1. O usas los mecanismos de entrada salida de C (printf, scanf) o los de C++ (cin, cout)... pero por favor, no los mezcles. Puede dar problemas.

2. No uses conio.h... más información al respecto aqui

3. No uses variables globales. Muy pocas veces es necesario su uso. Además hay que tener cuidado con ellas, pueden ser problemáticas y dificultan la lectura del código.

4. ¿Y si no se ha podido abrir el fichero?

doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
while(i<=5)
w=getc(doc); // Y si doc == NULL???


Te faltan comprobaciones ahí.

5. Si un if, un else, un while o un do-while ocupan más de una línea hay que usar llaves:

while(i<=5)
w=getc(doc);
if (w =='\n') printf ("\n");
else
printf("%c",w);


Ese código se va a quedar atascado en las dos primeras líneas. Como no hay llaves el while afecta únicamente a w=getc(doc).

Además, aunque pusieses llaves no estás incrementando i... luego seguirías en un bucle sin fin que finalizaría con error al terminar de leer todo el archivo.

6. Los nombres de las variables salen gratis... pon nombres que te den una idea de la función de dicha variable.

No es lo mismo:
if ( i > j || x < w )

que:
if ( velocidad > velocidadMaxima || fechaITV < hoy )

Seguro que con la segunda opción es más facil hacerse una idea de qué es lo que hace el código.

Puede que haya algún otro error... pero como tienes que darle un repaso serio al programa no merece la pena seguir mirando.

Juan821

#2
Ya hice lo que me dijiste pero persiste el error incluso puse para cuando doc sea null porque ahora me pone siempre error en la apertura del archivo, pero dime como soluciono lo del fichero y la librería la necesito para que se pause el programa porque con system pause no me gusta lo del printf no lo uso porque no me deja imprimir, la variable la necesito porque si responde una pregunta mal, hare que se salga del ciclo el programa todavia no esta completo


Eternal Idol

El path esta mal, no mire nada mas ya que eso salta a la vista, la \ se usa para secuencias de escape, la que corresponde usar en tu caso es \\ .
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

eferion

Cita de: Eternal Idol en 26 Junio 2014, 08:14 AM
El path esta mal, no mire nada mas ya que eso salta a la vista, la \ se usa para secuencias de escape, la que corresponde usar en tu caso es \\ .

Confiaba en que al ver que no se abrían los archivos, investigase un poco el tema y acabase viendo lo de las barras el solo.

Eternal Idol

Cita de: eferion en 26 Junio 2014, 08:35 AM
Confiaba en que al ver que no se abrían los archivos, investigase un poco el tema y acabase viendo lo de las barras el solo.

Le dijiste, como corresponde, que no usara conio.h y ahi sigue ... yo no confiaria tanto  ;D
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Juan821

Cita de: Eternal Idol en 26 Junio 2014, 09:22 AM
Le dijiste, como corresponde, que no usara conio.h y ahi sigue ... yo no confiaria tanto  ;D

Haber el error ya no es ese nisiquiera ya lo solucione era el users que no debe ir ahí porque es un comando prederminado, lo del conio es porque lo necesito y ahora mi problema es que el programa cuando abre el archivo entra en un bucle infinito y no sale porque no se todavia

eferion

Cita de: Juan821 en 26 Junio 2014, 21:55 PM
Haber el error ya no es ese nisiquiera ya lo solucione era el users que no debe ir ahí porque es un comando prederminado

O no te sabes explicar o no sabes lo que estás haciendo... lo que te dijo Eternal es

Cita de: Eternal Idol en 26 Junio 2014, 08:14 AM
El path esta mal, no mire nada mas ya que eso salta a la vista, la \ se usa para secuencias de escape, la que corresponde usar en tu caso es \\ .

Es decir, que sustituyeses los símbolos '\' por '\\', ya que '\' se utiliza para secuencias de escape, es decir, se interpreta ese carácter y el siguiente como uno solo que además tiene un efecto especial: '\n' salto de línea, '\t' tabulador, etc.

Dicho en cristiano. Tu ruta debería quedar: C:\\Users\\HERNAN\\Desktop\\prueba.txt

Cita de: Juan821 en 26 Junio 2014, 21:55 PM
lo del conio es porque lo necesito

Lo necesitas por... espera, no me lo digas... getch??

hay mil alternativas a getch... tu por ejemplo que estás usando C++ puedes recurrir, por ejemplo, a "std::cin.ignore()". Tiene la ventaja de que es una solución estándar y multiplataforma. Ahora, si prefieres coger malos hábitos nada más empezar tú mismo, es tu decisión.

Por cierto, si respondo a un mensaje con dudas lo menos que espero es que el interesado se tome la molestia de leer mi respuesta completa... por respeto y deferencia más que nada. Te lo digo porque te puse el enlace a un post en el que se indican malas prácticas en C y C++, además de explicar los motivos explica también diferentes posibilidades y soluciones. Por tu forma de hablar entiendo que has pasado de ese punto completamente... si no vas a leer las respuetas por que no te gustan... ¿para qué pides ayuda?

Cita de: Juan821 en 26 Junio 2014, 21:55 PM
y ahora mi problema es que el programa cuando abre el archivo entra en un bucle infinito y no sale porque no se todavia

Pues mira, si te molestases en leer las respuestas de la gente lo sabrías. Además también deberías aprender a usar el depurador de código... al principio cuesta cogerle el punto, pero en cuanto adquieres soltura descubres lo práctico y útil que es: te permite evaluar y modificar variables, ves la secuencia de ejecución, puedes saltar instrucciones...



Juan821

Cita de: eferion en 27 Junio 2014, 08:17 AM
Pues mira, si te molestases en leer las respuestas de la gente lo sabrías. Además también deberías aprender a usar el depurador de código... al principio cuesta cogerle el punto, pero en cuanto adquieres soltura descubres lo práctico y útil que es: te permite evaluar y modificar variables, ves la secuencia de ejecución, puedes saltar instrucciones...



Ok coregire lo del getch pero lo del bucle infinito ya puse a aumentar la i osea no estoy habalando del bucle del while de la funcion principal, estoy hablando del siclo que hay en las otras funciones el while y quitare la conio.h despues pero ese es mi problema mas grande si estoy aumentando cada vez que hay salto de linea porque no se detiene el programa?

eferion

si por aumentar i te refieres a i=1+1 ... que es como tienes en tu código... ahí i va a valer SIEMPRE 2... luego NUNCA va a alcanzar el valor necesario para que el código abandone el bucle... ahí es donde entra la parte de aprender a usar el depurador... si usas el depurador este problema lo ves en seguida porque te das cuenta de que i no cambia su valor en la vida.