• Domingo 15 de Diciembre de 2024, 23:58

Autor Tema:  Problemas Con Ficheros  (Leído 1645 veces)

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Problemas Con Ficheros
« en: Jueves 29 de Abril de 2004, 15:11 »
0
Buenas !!

Tengo un problema, estoy empezando a estudiar los ficheros y me encuentro con muchos problemas. Bueno os pongo este problema que tengo y si me ayudais os lo agradecere mucho :D

Esto es un simple programa que lee una cadena ( 5 palabras ), lo almacena en un archivo llamado "Texto.txt"·.Luego lee este archivo y si encuentra cierta palabra ( introducida por el usuario ) la sustituye por otra ( tb introducida por el usuario ) y va copiando el texto a otro archivo ("Texto2.txt") de tal forma q quede en texto2.txt el texto inicial pero con las sustituciones.

Mi problema es que si por ejemplo, pongo la cadena "Esto es una piuta mierda" y sustituyo "mierda" por "basura", a la hora de leer el fichero resultado... me imprime "Esto es una piuta mierda mierda". Es decir, el bucle while se me repite una vez mas de lo normal.. La condicion de salida del while es !feof(f) donde f es el canal del archivo de lectura.

Aki os dejo el codigo :)

Código: Text
  1.  
  2. #include < stdio.h >
  3. #include < conio.h >
  4. #include < process.h >
  5. #include < string.h >
  6.  
  7. void main()
  8. {
  9.  
  10. FILE *f,*g;
  11. char cad[80],palabra[10],sustituir[10];
  12. char cad2[80];
  13. int aux,cont=0;
  14.  
  15.  
  16. if(!(f=fopen("texto.txt","rt")))
  17. {
  18. puts("Error !");
  19. exit(1);
  20. }
  21.  
  22. if(!(g=fopen("texto2.txt","w+t")))
  23. {
  24. puts("Error !");
  25. exit(1);
  26. }
  27.  
  28. printf("Introduce la palabra que quieres sustituir: ");
  29. scanf("%s",&palabra);
  30.  
  31. printf("\n\nIntroduce la palabra por la que la quieres sustituir: ");
  32. scanf("%s",&sustituir);
  33.  
  34.  
  35. while (!feof(f))
  36. {     // leer en archivo.
  37. fscanf(f,"%s",cad);
  38.  
  39. aux=strcmp(cad,palabra);
  40.  
  41.   if (aux==0)
  42.   {
  43.     fprintf(g," %s",sustituir);
  44.                 cont++;
  45.    
  46.          }else{
  47.   fprintf(g," %s",cad);
  48.  
  49.         }
  50. }
  51.  
  52. rewind(g);
  53.  
  54. printf("\n\nTexto resultante: ");
  55. while(!feof(g))
  56. {     // leer en archivo.
  57. fscanf(g,"%s",cad2);
  58.  
  59. printf("%s ",cad2);
  60.  
  61. }
  62. rewind(f);
  63. printf("\n\nTexto inical: ");
  64. while(!feof(f))
  65. {     // leer en archivo.
  66. fscanf(f,"%s",cad2);
  67.  
  68. printf("%s ",cad2);
  69.  
  70. }
  71.  
  72. printf("\n\nSustituciones: %d",cont);
  73.  
  74. fclose(f);
  75. fclose(g);
  76.  
  77.  
  78.  
  79. }
  80.  

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problemas Con Ficheros
« Respuesta #1 en: Jueves 29 de Abril de 2004, 16:59 »
0
Hola.

El problema es que en la última iteración, cuando intentas leer y ya no lee nada, imprimes lo que leiste la iteración anterior. Esto es debido a que feof no devuelte TRUE hasta que no se ha intentado leer y no se ha leido nada. Puedes solucionarlo comprobando el retorno de fscanf. Si retorna 1 es que ha leido una palabra con éxito. Si retorna 0 es que no la ha leido y no debería ejecutarse printf o fprintf.

Un saludo.

Ruben3d

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Problemas Con Ficheros
« Respuesta #2 en: Jueves 29 de Abril de 2004, 21:36 »
0
quieres decir esto ?


Código: Text
  1.  
  2.  
  3. while(!feof(f))
  4. {     // leer en archivo.
  5.  
  6. if (fscanf(f,"%s",cad2)) printf("%s ",cad2);
  7.  
  8. }
  9.  
  10.  
  11.  

si dices asi, no me va  :unsure:

no te entiendo :( help me xfavor :(

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problemas Con Ficheros
« Respuesta #3 en: Jueves 29 de Abril de 2004, 21:43 »
0
Sí, eso mismo. Pero hazlo en cada sitio en el que la condición de un bucle incluya feof y dentro del cuerpo esté un fscanf.

Un saludo.

Ruben3d

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Problemas Con Ficheros
« Respuesta #4 en: Jueves 29 de Abril de 2004, 22:16 »
0
hmmm tal y como tu dices quedaria asi:


Código: Text
  1.  
  2.  
  3. #include < stdio.h >
  4. #include < conio.h >
  5. #include < process.h >
  6. #include < string.h >
  7.  
  8. void main()
  9. {
  10.  
  11. FILE *f,*g;
  12. char cad[80],palabra[10],sustituir[10];
  13. char cad2[80];
  14. int aux,cont=0;
  15.  
  16.  
  17. if(!(f=fopen("texto.txt","rt")))
  18. {
  19. puts("Error !");
  20. exit(1);
  21. }
  22.  
  23. if(!(g=fopen("texto2.txt","w+t")))
  24. {
  25. puts("Error !");
  26. exit(1);
  27. }
  28.  
  29. printf("Introduce la palabra que quieres sustituir: ");
  30. scanf("%s",&palabra);
  31.  
  32. printf("\n\nIntroduce la palabra por la que la quieres sustituir: ");
  33. scanf("%s",&sustituir);
  34.  
  35.  
  36. while (!feof(f))
  37. {     // leer en archivo.
  38.  
  39. if (fscanf(f,"%s",cad))
  40. {
  41.  
  42. aux=strcmp(cad,palabra);
  43.  
  44.   if (aux==0)
  45.   {
  46.     fprintf(g," %s",sustituir);
  47.                 cont++;
  48.    
  49.          }else{
  50.   fprintf(g," %s",cad);
  51.  
  52.   }
  53. }
  54. }
  55.  
  56. rewind(g);
  57.  
  58. printf("\n\nTexto resultante: ");
  59.  
  60. while(!feof(g))
  61. {     // leer en archivo.
  62.  
  63. if (fscanf(g,"%s",cad2)) printf("%s ",cad2);
  64.  
  65. }
  66.  
  67. rewind(f);
  68.  
  69. printf("\n\nTexto inical: ");
  70.  
  71. while(!feof(f))
  72. {     // leer en archivo.
  73.  
  74. if (fscanf(f,"%s",cad2)) printf("%s ",cad2);
  75.  
  76. }
  77.  
  78. printf("\n\nSustituciones: %d",cont);
  79.  
  80. fclose(f);
  81. fclose(g);
  82.  
  83.  
  84.  
  85. }
  86.  


sigue pasandome lo mismo :(

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problemas Con Ficheros
« Respuesta #5 en: Jueves 29 de Abril de 2004, 22:25 »
0
Yo tuve un problema como el tuyo (se me duplicaba lo último que leia) y se me arregló haciendo eso. Si te sigue fallando y no es de eso no veo el porqué, tengo espesura mental. A ver si alguien te encuentra el fallo.

Un saludo.

Ruben3d

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Problemas Con Ficheros
« Respuesta #6 en: Jueves 29 de Abril de 2004, 22:28 »
0
gracias de todas maneras, si alguien me puede ayudar se lo agradeceria muchisimo.


GRACIAS :D

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Problemas Con Ficheros
« Respuesta #7 en: Jueves 29 de Abril de 2004, 22:58 »
0
ya pilllé el fallo, vaya tonteria :( cuando escribia la frase a sustituir, la almacenaba con un espacio al final de la cadena, entonces el bucle se repetia una vez de mas por ese espacio.

Gracias por tu ayuda Ruben3d ;)