Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: magictheory en 30 Octubre 2016, 20:20 pm



Título: Problema con bucle infinito
Publicado por: magictheory en 30 Octubre 2016, 20:20 pm
Hola a toda la comunidad, les deseo prospero dia!!
Resulta que tengo un codio que me produce un bucle infinito y las verdad no se porque me  
produce eso. Lo que hago es algo simple. Cargo dos archivos y en uno de los archivos quiero modificar el stock, osea actualizarlo, nada mas. A continuacion les paso el codigo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct materiales{
  6. int codart, stock, stockmin;
  7. char desc[20];
  8. float precio;
  9. };
  10. struct ventas{
  11. int cod,cant;
  12. };
  13.  
  14.  
  15. //ACA YO CARGO EL ARCHIVO AMTERIALES
  16. main(){
  17. FILE *materiales;
  18. FILE *archivoventa;
  19. fpos_t pos;
  20. int op;
  21. struct materiales mat;
  22. struct ventas ven;
  23. if((materiales=fopen("materiales.dat","wb"))!=NULL){
  24. do{
  25. printf("\n\tIngrese el codigo del articulo");
  26. scanf("%d", &mat.codart);
  27. printf("\n\tIngrese un breve descripcion");
  28. gets(mat.desc);
  29. printf("\n\tIngrese stock actual del articulo");
  30. scanf("%d", &mat.stock);
  31. printf("\n\tIngrese stock minimo");
  32. scanf("%d", &mat.stockmin);
  33. printf("\n\tPor utimo ingrese precio");
  34. scanf("%f", &mat.precio);
  35. fwrite(&mat,sizeof(mat),1,materiales);
  36. printf("\n\t¿Desea ingresar otro articulo? [1]-para SI // [0]-Para NO");
  37. scanf("%d", &op);
  38. }while(op!=0);
  39. }else{
  40. printf("\n\nError de archivo");
  41. }
  42. fclose(materiales);
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51. //ACA YO CARGO EL ARCHIVO VENTAS
  52.  
  53.  
  54.  
  55.    int opc;
  56.  
  57.    if((archivoventa=fopen("ventas.dat","wb"))!=NULL){
  58. do{
  59.    printf("\n\tIngrese codigo del articulo");
  60. scanf("%d", &ven.cod);
  61. printf("\n\tIngrese cantidad vendida del articulo");
  62. scanf("%d", &ven.cant);
  63. fwrite(&ven,sizeof(ven),1,archivoventa);
  64. printf("\n\t¿Desea registrar otra venta? [1]-Para SI // [0]-Para NO");
  65. scanf("%d", &opc);
  66. }while(opc!=0);
  67.    }else{
  68. printf("\nError de archivo");
  69.    }
  70.    fclose(archivoventa);
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.    //ACA ES DONDE ESTA LA FALLA
  82.  
  83.  
  84.    if((archivoventa=fopen("ventas.dat","rb"))!=NULL){
  85.        if((materiales=fopen("materiales.dat","r+b"))!=NULL){
  86. fread(&ven,sizeof(ven),1,archivoventa);
  87. while(!feof(archivoventa)){
  88. fread(&mat,sizeof(mat),1,materiales);      
  89. while(!feof(materiales)){
  90. if(mat.codart==ven.cod){
  91. mat.stock=mat.stock-ven.cant;
  92. printf("\n\nEl stock entonces quedo en %d", mat.stock);
  93. fseek(materiales, -1*(sizeof(mat)),SEEK_CUR);
  94. fwrite(&mat,sizeof(mat),1,materiales);
  95. }
  96. fread(&mat,sizeof(mat),1,materiales);
  97. printf("\nHola");    
  98.         }
  99.         rewind(materiales);
  100. fread(&ven,sizeof(ven),1,archivoventa);
  101. printf("\nHola2");  
  102.    }
  103.    }else{
  104.    printf("\nError archivo");
  105.    }
  106.    fclose(materiales);
  107. }else{
  108.      printf("\nError archivo");
  109.    }  
  110. fclose(archivoventa);  
  111. printf("\n\t\tError3");
  112.  
  113.  
  114. if((materiales=fopen("materiales.dat","rb"))!=NULL){
  115. fread(&mat,sizeof(mat),1,materiales);
  116. while(!feof(materiales)){
  117. printf("\n\nEl codigo de articulo es %d",mat.codart);
  118. printf("\n\nEl stock actualizado quedo asi %d",mat.stock);
  119. fread(&mat,sizeof(mat),1,materiales);
  120. }
  121.    }else{
  122. printf("Error");
  123.    }
  124.    fclose(materiales);
  125. }
  126.  
  127.  



Les agradeceria si me pueden ayudar!!!!!


Mod: Los titulo deben ser descriptivos


Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: MAFUS en 31 Octubre 2016, 00:54 am
He cambiado la variable tipo FILE* materiales por archivomateriales, para evitar un posible conflicto con el nombre del struct y esto es lo que he conseguido del programa:
   Ingrese el codigo del articulo1

   Ingrese un breve descripcionmesa

   Ingrese stock actual del articulo10

   Ingrese stock minimo5

   Por utimo ingrese precio10

   ¿Desea ingresar otro articulo? [1]-Para SI //
  • -Para NO0

   Ingrese codigo del articulo1

   Ingrese cantidad vendida del articulo6

   ¿Desea registrar otra venta? [1]-Para SI //
  • -Para NO0


El stock entonces quedo en 4
Hola
Hola2
      Error3

El codigo de articulo es 1

El stock actualizado quedo asi 4



Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: magictheory en 31 Octubre 2016, 01:42 am
Hola muchas gracias por tu respuesta!!!!
Hola vos decis que el dev c++ puede llegar a confundirse? Vos lo compilaste en linux?



Hola MAFUS acabo de probar cambiar el nombre del archivo pero me sigue provocando un bucle infinito, que solo me imprime la palabra "hola". Vos solo le cambiaste eso o alguna cosa mas? Desde ya te agradezco!!!


Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: MAFUS en 31 Octubre 2016, 02:20 am
Eso y el gets por fgets para prevenir desbordamiento de buffer. Aquí el código modificado:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct materiales{
  6.   int codart, stock, stockmin;
  7.   char desc[20];
  8.   float precio;
  9. };
  10. struct ventas{
  11.      int cod,cant;
  12. };
  13.  
  14.  
  15. //ACA YO CARGO EL ARCHIVO AMTERIALES
  16. int main() {
  17.    FILE *archivomateriales;
  18.    FILE *archivoventa;
  19.    int op;
  20.    struct materiales mat;
  21.    struct ventas ven;
  22.  
  23.    if((archivomateriales=fopen("materiales.dat","wb")) != NULL) {
  24.        do {
  25.            printf("\n\tIngrese el codigo del articulo");
  26.            scanf("%d", &mat.codart);
  27.            printf("\n\tIngrese un breve descripcion");
  28.            getchar();
  29.            fgets(mat.desc, 20, stdin);
  30.            printf("\n\tIngrese stock actual del articulo");
  31.            scanf("%d", &mat.stock);
  32.            printf("\n\tIngrese stock minimo");
  33.            scanf("%d", &mat.stockmin);
  34.            printf("\n\tPor utimo ingrese precio");
  35.            scanf("%f", &mat.precio);
  36.            fwrite(&mat, sizeof(mat), 1, archivomateriales);
  37.            printf("\n\t¿Desea ingresar otro articulo? [1]-Para SI // [0]-Para NO");
  38.            scanf("%d", &op);
  39.        } while(op != 0);
  40.   }
  41.   else {
  42.      printf("\n\nError de archivo");
  43.   }
  44.   fclose(archivomateriales);
  45.  
  46. //ACA YO CARGO EL ARCHIVO VENTAS
  47.  
  48.    int opc;
  49.  
  50.    if((archivoventa=fopen("ventas.dat","wb")) != NULL) {
  51.        do{
  52.            printf("\n\tIngrese codigo del articulo");
  53.            scanf("%d", &ven.cod);
  54.            printf("\n\tIngrese cantidad vendida del articulo");
  55.            scanf("%d", &ven.cant);
  56.            fwrite(&ven,sizeof(ven),1,archivoventa);
  57.            printf("\n\t¿Desea registrar otra venta? [1]-Para SI // [0]-Para NO");
  58.            scanf("%d", &opc);
  59.        } while(opc!=0);
  60.    }
  61.    else {
  62.      printf("\nError de archivo");
  63.    }
  64.    fclose(archivoventa);
  65.  
  66.    //ACA ES DONDE ESTA LA FALLA
  67.  
  68.    if((archivoventa=fopen("ventas.dat","rb")) != NULL) {
  69.        if((archivomateriales=fopen("materiales.dat","r+b")) != NULL) {
  70.            fread(&ven, sizeof(ven), 1, archivoventa);
  71.            while(!feof(archivoventa)) {  
  72.                fread(&mat, sizeof(mat), 1, archivomateriales);          
  73.                while(!feof(archivomateriales)) {  
  74.                    if(mat.codart == ven.cod) {
  75.                         mat.stock = mat.stock-ven.cant;
  76.                         printf("\n\nEl stock entonces quedo en %d", mat.stock);
  77.                         fseek(archivomateriales, -1*(sizeof(mat)),SEEK_CUR);
  78.                         fwrite(&mat,sizeof(mat), 1, archivomateriales);
  79.                    }                        
  80.                    fread(&mat, sizeof(mat), 1, archivomateriales);
  81.                    printf("\nHola");    
  82.                }
  83.                rewind(archivomateriales);
  84.                fread(&ven,sizeof(ven),1,archivoventa);
  85.                printf("\nHola2");  
  86.            }
  87.        }
  88.        else {
  89.            printf("\nError archivo");
  90.        }
  91.        fclose(archivomateriales);  
  92.    }
  93.    else {
  94.        printf("\nError archivo");
  95.    }  
  96.    fclose(archivoventa);  
  97.    printf("\n\t\tError3");
  98.  
  99.    if((archivomateriales=fopen("materiales.dat","rb")) != NULL){
  100.        fread(&mat, sizeof(mat), 1, archivomateriales);
  101.        while(!feof(archivomateriales)) {
  102.            printf("\n\nEl codigo de articulo es %d", mat.codart);
  103.            printf("\n\nEl stock actualizado quedo asi %d", mat.stock);
  104.            fread(&mat, sizeof(mat), 1, archivomateriales);
  105.        }
  106.    }
  107.    else {
  108.        printf("Error");
  109.    }
  110.    fclose(archivomateriales);
  111. }


Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: magictheory en 31 Octubre 2016, 02:40 am
Hola mafus, lo copie tal cual en el devc++ y me sigue el bucle infinito.... Que sera que puede ser?


Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: MAFUS en 31 Octubre 2016, 10:20 am
Si me puedes copiar la salida del tu pantalla desde que ejecutas hasta que empieza a repetir sin control te pordía ayudar mejor.


Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: magictheory en 31 Octubre 2016, 15:16 pm
Hola mafus, lo probe en linux con el geany anduvo. Porque sera que con el devc++ no anduvo?


Título: Re: Hola necesito ayuda con este codigo porfavor
Publicado por: MAFUS en 31 Octubre 2016, 16:08 pm
Solo tengo linux así que no puedo probar. Copiaras aquí toda la salida de la consola o subieras una imagen de ella hasta que empieza el bucle eterno podría tener una idea de por donde va el flujo.


Título: Re: Problema con bucle infinito
Publicado por: magictheory en 1 Noviembre 2016, 12:57 pm
Hola ahi subi las dos imagenes
(https://s15.postimg.org/z69g0ae1z/Sin_t_tulo.jpg) (https://postimg.org/image/z69g0ae1z/)

(https://s15.postimg.org/fcxc7l0o7/Sin_t_tulo2.jpg) (https://postimg.org/image/fcxc7l0o7/)
 
Una es antes y otra es despues del bucle...