Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Juan821 en 25 Junio 2014, 20:01 pm



Título: Ayuda en programa con ficheros!
Publicado por: Juan821 en 25 Junio 2014, 20:01 pm
Tengo un problema con este codigo
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <conio.h>
  5. #include <stdio.h>
  6. FILE *doc;
  7. using namespace std;
  8. int His();
  9. int Cien();
  10. int Depor();
  11. int Geo();
  12. int c=1;
  13. int main()
  14. {
  15. int s,tot,u=0;
  16. srand(time(NULL));
  17. while (c==1)
  18. {
  19. system ("cls");
  20. cout<<"Presione cualquier tecla para escoger su categoria"<<endl;
  21. getch();
  22. s=rand()% 4 + 1;
  23.  
  24. switch (s)
  25. {
  26. case 1:
  27. {
  28. His();
  29. break;
  30. }
  31. case 2:
  32. {
  33. Cien();
  34. break;
  35. }
  36. case 3:
  37. {
  38. Depor();
  39. break;
  40. }
  41. case 4:
  42. {
  43. Geo();
  44. break;
  45. }
  46. }
  47. }
  48. system ("pause");
  49. return 0;
  50. }
  51.  
  52. int His()
  53. {
  54. int x,i=1,w;
  55. system ("cls");
  56. cout<<"<===============Su categoria es Historia===============>"<<endl;
  57. cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
  58. getch();
  59. doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
  60. while(i<=5)
  61. w=getc(doc);
  62. if (w =='\n') printf ("\n");
  63. else
  64. printf("%c",w);
  65. fclose(doc);
  66. return 0;
  67. }
  68. int Depor()
  69. {
  70. int x,i=1,w;
  71. system ("cls");
  72. cout<<"<===============Su categoria es Ciencia===============>"<<endl;
  73. cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
  74. getch();
  75. doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
  76. while(i<=5)
  77. w=getc(doc);
  78. if (w =='\n') printf ("\n");
  79. else
  80. printf("%c",w);
  81. fclose(doc);
  82. return 0;
  83. }
  84. int Cien()
  85. {
  86. int x,i=1,w;
  87. system ("cls");
  88. cout<<"<===============Su categoria es Deportes===============>"<<endl;
  89. cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
  90. getch();
  91. doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
  92. while(i<=5)
  93. w=getc(doc);
  94. if (w =='\n') printf ("\n");
  95. else
  96. printf("%c",w);
  97. fclose(doc);
  98. return 0;
  99. }
  100. int Geo()
  101. {
  102. int x,i=1,w;
  103. system ("cls");
  104. cout<<"<===============Su categoria es Geografia===============>"<<endl;
  105. cout<<"Presione cualquier tecla para escoger su pregunta"<<endl;
  106. getch();
  107. doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
  108. while(i<=5)
  109. w=getc(doc);
  110. if (w =='\n') printf ("\n");
  111. else
  112. printf("%c",w);
  113. fclose(doc);
  114. return 0;
  115. }
  116.  
  117.  

El problema en la ejecución es este
(http://fotos.subefotos.com/22e9cdc29500e5efb7c5de3e998cdd8eo.png)


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



Título: Re: Ayuda!
Publicado por: eferion en 25 Junio 2014, 21:59 pm
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 (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

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?

Código
  1. doc = fopen("C:\Users\HERNAN\Desktop\prueba.txt","r");
  2. while(i<=5)
  3. 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:

Código
  1. while(i<=5)
  2. w=getc(doc);
  3. if (w =='\n') printf ("\n");
  4. else
  5. 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:
Código
  1. if ( i > j || x < w )

que:
Código
  1. 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.


Título: Re: Ayuda!
Publicado por: Juan821 en 25 Junio 2014, 23:57 pm
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



Título: Re: Ayuda!
Publicado por: 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 (http://en.wikipedia.org/wiki/Escape_sequences_in_C), la que corresponde usar en tu caso es \\ .


Título: Re: Ayuda!
Publicado por: eferion en 26 Junio 2014, 08:35 am
El path esta mal, no mire nada mas ya que eso salta a la vista, la \ se usa para secuencias de escape (http://en.wikipedia.org/wiki/Escape_sequences_in_C), 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.


Título: Re: Ayuda!
Publicado por: Eternal Idol en 26 Junio 2014, 09:22 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


Título: Re: Ayuda!
Publicado por: Juan821 en 26 Junio 2014, 21:55 pm
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


Título: Re: Ayuda!
Publicado por: eferion en 27 Junio 2014, 08:17 am
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

El path esta mal, no mire nada mas ya que eso salta a la vista, la \ se usa para secuencias de escape (http://en.wikipedia.org/wiki/Escape_sequences_in_C), 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

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?

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




Título: Re: Ayuda!
Publicado por: Juan821 en 27 Junio 2014, 21:43 pm
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?


Título: Re: Ayuda!
Publicado por: eferion en 28 Junio 2014, 16:26 pm
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.


Título: Re: Ayuda!
Publicado por: Juan821 en 30 Junio 2014, 02:54 am
bueno ya coregido todo lo que me dijeron quiero mostrarles una cosa haber si me pueden ayudar estudie lo de los strings como me dijeron y saque un programa mas de conocimiento lo hice con logica pero quiero que me digan lo del patcher y un pequeño error que me sale primero les mostrare el codigo
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5. #include <fstream>
  6. using namespace std;
  7. int main()
  8. {
  9. int f,i=1,s=1,w,r;
  10. char x[1];
  11. system ("cls");
  12. printf("\n <===============Su categoria es Historia===============> \n");
  13. printf("\n Presione cualquier tecla para escoger su pregunta \n");
  14. cin.ignore();
  15. ofstream res;
  16. res.open("D:\\res.txt",ofstream::out | ofstream::trunc);
  17. ifstream resp;
  18. resp.open("D:\\res.txt");
  19. ifstream narchivos;
  20. narchivos.open("D:\\prueba.txt");
  21. ifstream enarchivos;
  22. enarchivos.open("D:\\prueba.txt");
  23. ifstream archivos;
  24. archivos.open("D:\\prueba.txt");
  25. while (!enarchivos.eof())
  26. {
  27. i++;
  28. f=enarchivos.get();
  29. }
  30. enarchivos.close();
  31. i=i-2;
  32. while (s<=i)
  33. {
  34. f=narchivos.get();
  35. s++;
  36. }
  37. i=i-1;
  38. s=1;
  39. while (s<=i)
  40. {
  41. r=archivos.get();
  42.  
  43. if (r =='\n')
  44. {
  45. printf ("\n");
  46. }
  47. else printf("%c",r);
  48. s++;
  49. }
  50. enarchivos.close();
  51. scanf("%s",x);
  52. res<<x<<endl;
  53. w=resp.get();
  54. if (w==f)
  55. {
  56. printf("Su respuesta fue correcta felicitaciones!");
  57. cin.ignore();
  58.  
  59. }
  60. else
  61. {
  62. printf("Respuesta incorrecta es el turno del otro jugador");
  63. cin.ignore();
  64. }
  65. res.close();
  66. resp.close();
  67. enarchivos.close();
  68. narchivos.close();
  69. archivos.close();
  70. cin.ignore();
  71. system("del c:\\res.txt");
  72. return 0;
  73.  
  74. }

Cuando termino el programa me dice que la variable x la corrompieron (ya lo depure mucho tiempo) y el archivo que quiero que se me borre no se borra :'( y lo otro es lo del path yo quiero que en en vez del prueba.txt pongo la f que esta como variable como hago para que me lea lo que hay dentro de la variable y no que se abra el archivo con nombre f esto dentro del patcher si pueden ayudarme muchas gracias por adelantado


Título: Re: Ayuda en programa con ficheros!
Publicado por: eferion en 1 Julio 2014, 09:00 am
Cuando termino el programa me dice que la variable x la corrompieron (ya lo depure mucho tiempo)

Una cadena de caracteres, al estilo C que es la que estás usando, se componen de una secuencia de caracteres que termina con el carácter nulo '\0'. Esto quiere decir que si quieres almacenar un texto de 30 caracteres, necesitas un buffer que tamaño igual o superior a 31.

En tu caso tienes char x[1] ... es decir, estás definiendo un arreglo de caracteres de tamaño 1... lo que te permite almacenar, bien un caracter suelto, bien una cadena vacía (solo el carácter nulo). Al intentar almacenar una cadena de caracteres en x, tu código escribirá fuera del espacio reservado para X, por eso te sale el mensaje de memoria corrupta. Debes modificar ese '1' para que tenga un valor igual o superior a "LongitudMaximaDelTextoAAlmacenar+1"

La opción b es usar la clase string y olvidarse de tener que gestionar las cadenas de caracteres a tan bajo nivel.

el archivo que quiero que se me borre no se borra

Deberías fijarte un poco más en tu código:

Código
  1. res.open("D:\\res.txt",ofstream::out | ofstream::trunc);
  2.  
  3. // ...
  4.  
  5. system("del c:\\res.txt");

Es el problema de tener valores constantes "a pelo" en el código, sobretodo cuando están repetidos...

pista: Fíjate en los dos path y busca diferencias.

yo quiero que en en vez del prueba.txt pongo la f que esta como variable como hago para que me lea lo que hay dentro de la variable y no que se abra el archivo con nombre f

Deberías aprender a expresarte un poco mejor.

¿Pretendes no tener que poner el path "a pelo" al abrir los ficheros?

¿Quieres usar 'f' para elegir que fichero tienes que abrir?
Esto no lo vas a poder hacer porque f es de tipo int, no es un string.

¿Quieres que el contenido del fichero se vuelque en 'f'?
Recuerda que 'f' solo puede guardar un entero por vez.

¿Es otra cosa?
Tendrás que replantear la forma de expresar tu problema.


Título: Re: Ayuda en programa con ficheros!
Publicado por: Juan821 en 1 Julio 2014, 21:09 pm
Uyyy si muchas gracias bien ahora debo adivinar como poner el path para que se abra desde la ruta donde esta el archivo cpp esto se puede hacer?


Título: Re: Ayuda en programa con ficheros!
Publicado por: Eternal Idol en 2 Julio 2014, 01:22 am
dir\file.txt