Problema con bucle infinito

Iniciado por magictheory, 30 Octubre 2016, 20:20 PM

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

magictheory

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:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct materiales{
int codart, stock, stockmin;
char desc[20];
float precio;
};
struct ventas{
int cod,cant;
};


//ACA YO CARGO EL ARCHIVO AMTERIALES
main(){
FILE *materiales;
FILE *archivoventa;
fpos_t pos;
int op;
struct materiales mat;
struct ventas ven;
if((materiales=fopen("materiales.dat","wb"))!=NULL){
do{
printf("\n\tIngrese el codigo del articulo");
scanf("%d", &mat.codart);
printf("\n\tIngrese un breve descripcion");
getchar();
gets(mat.desc);
printf("\n\tIngrese stock actual del articulo");
scanf("%d", &mat.stock);
printf("\n\tIngrese stock minimo");
scanf("%d", &mat.stockmin);
printf("\n\tPor utimo ingrese precio");
scanf("%f", &mat.precio);
fwrite(&mat,sizeof(mat),1,materiales);
printf("\n\t¿Desea ingresar otro articulo? [1]-para SI // [0]-Para NO");
scanf("%d", &op);
}while(op!=0);
}else{
printf("\n\nError de archivo");
}
fclose(materiales);








//ACA YO CARGO EL ARCHIVO VENTAS



   int opc;

   if((archivoventa=fopen("ventas.dat","wb"))!=NULL){
do{
   printf("\n\tIngrese codigo del articulo");
scanf("%d", &ven.cod);
printf("\n\tIngrese cantidad vendida del articulo");
scanf("%d", &ven.cant);
fwrite(&ven,sizeof(ven),1,archivoventa);
printf("\n\t¿Desea registrar otra venta? [1]-Para SI // [0]-Para NO");
scanf("%d", &opc);
}while(opc!=0);
   }else{
printf("\nError de archivo");
   }
   fclose(archivoventa);
   
   
   
   
   
   
   
   
   
   
   //ACA ES DONDE ESTA LA FALLA

       
   if((archivoventa=fopen("ventas.dat","rb"))!=NULL){
       if((materiales=fopen("materiales.dat","r+b"))!=NULL){
fread(&ven,sizeof(ven),1,archivoventa);
while(!feof(archivoventa)){
fread(&mat,sizeof(mat),1,materiales);      
while(!feof(materiales)){
if(mat.codart==ven.cod){
mat.stock=mat.stock-ven.cant;
printf("\n\nEl stock entonces quedo en %d", mat.stock);
fseek(materiales, -1*(sizeof(mat)),SEEK_CUR);
fwrite(&mat,sizeof(mat),1,materiales);
}
fread(&mat,sizeof(mat),1,materiales);
printf("\nHola");    
        }
        rewind(materiales);
fread(&ven,sizeof(ven),1,archivoventa);
printf("\nHola2");  
   }
   }else{
   printf("\nError archivo");
   }
   fclose(materiales);
}else{
     printf("\nError archivo");
   }  
fclose(archivoventa);  
printf("\n\t\tError3");

   
if((materiales=fopen("materiales.dat","rb"))!=NULL){
fread(&mat,sizeof(mat),1,materiales);
while(!feof(materiales)){
printf("\n\nEl codigo de articulo es %d",mat.codart);
printf("\n\nEl stock actualizado quedo asi %d",mat.stock);
fread(&mat,sizeof(mat),1,materiales);
}
   }else{
printf("Error");
   }
   fclose(materiales);
}





Les agradeceria si me pueden ayudar!!!!!


Mod: Los titulo deben ser descriptivos

MAFUS

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


magictheory

#2
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!!!

MAFUS

Eso y el gets por fgets para prevenir desbordamiento de buffer. Aquí el código modificado:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct materiales{
   int codart, stock, stockmin;
   char desc[20];
   float precio;
};
struct ventas{
      int cod,cant;
};


//ACA YO CARGO EL ARCHIVO AMTERIALES
int main() {
    FILE *archivomateriales;
    FILE *archivoventa;
    int op;
    struct materiales mat;
    struct ventas ven;
   
    if((archivomateriales=fopen("materiales.dat","wb")) != NULL) {
        do {
            printf("\n\tIngrese el codigo del articulo");
            scanf("%d", &mat.codart);
            printf("\n\tIngrese un breve descripcion");
            getchar();
            fgets(mat.desc, 20, stdin);
            printf("\n\tIngrese stock actual del articulo");
            scanf("%d", &mat.stock);
            printf("\n\tIngrese stock minimo");
            scanf("%d", &mat.stockmin);
            printf("\n\tPor utimo ingrese precio");
            scanf("%f", &mat.precio);
            fwrite(&mat, sizeof(mat), 1, archivomateriales);
            printf("\n\t¿Desea ingresar otro articulo? [1]-Para SI // [0]-Para NO");
            scanf("%d", &op);
        } while(op != 0);
   }
   else {
      printf("\n\nError de archivo");
   }
   fclose(archivomateriales);
   
//ACA YO CARGO EL ARCHIVO VENTAS

    int opc;

    if((archivoventa=fopen("ventas.dat","wb")) != NULL) {
        do{
            printf("\n\tIngrese codigo del articulo");
            scanf("%d", &ven.cod);
            printf("\n\tIngrese cantidad vendida del articulo");
            scanf("%d", &ven.cant);
            fwrite(&ven,sizeof(ven),1,archivoventa);
            printf("\n\t¿Desea registrar otra venta? [1]-Para SI // [0]-Para NO");
            scanf("%d", &opc);
        } while(opc!=0);
    }
    else {
      printf("\nError de archivo");
    }
    fclose(archivoventa);
   
    //ACA ES DONDE ESTA LA FALLA
   
    if((archivoventa=fopen("ventas.dat","rb")) != NULL) {
        if((archivomateriales=fopen("materiales.dat","r+b")) != NULL) {
            fread(&ven, sizeof(ven), 1, archivoventa);
            while(!feof(archivoventa)) {   
                fread(&mat, sizeof(mat), 1, archivomateriales);           
                while(!feof(archivomateriales)) {   
                    if(mat.codart == ven.cod) {
                         mat.stock = mat.stock-ven.cant;
                         printf("\n\nEl stock entonces quedo en %d", mat.stock);
                         fseek(archivomateriales, -1*(sizeof(mat)),SEEK_CUR);
                         fwrite(&mat,sizeof(mat), 1, archivomateriales);
                    }                       
                    fread(&mat, sizeof(mat), 1, archivomateriales);
                    printf("\nHola");     
                }
                rewind(archivomateriales);
                fread(&ven,sizeof(ven),1,archivoventa);
                printf("\nHola2"); 
            }
        }
        else {
            printf("\nError archivo");
        }
        fclose(archivomateriales);   
    }
    else {
        printf("\nError archivo");
    } 
    fclose(archivoventa); 
    printf("\n\t\tError3");
   
    if((archivomateriales=fopen("materiales.dat","rb")) != NULL){
        fread(&mat, sizeof(mat), 1, archivomateriales);
        while(!feof(archivomateriales)) {
            printf("\n\nEl codigo de articulo es %d", mat.codart);
            printf("\n\nEl stock actualizado quedo asi %d", mat.stock);
            fread(&mat, sizeof(mat), 1, archivomateriales);
        }
    }
    else {
        printf("Error");
    }
    fclose(archivomateriales);
}

magictheory

Hola mafus, lo copie tal cual en el devc++ y me sigue el bucle infinito.... Que sera que puede ser?

MAFUS

Si me puedes copiar la salida del tu pantalla desde que ejecutas hasta que empieza a repetir sin control te pordía ayudar mejor.

magictheory

Hola mafus, lo probe en linux con el geany anduvo. Porque sera que con el devc++ no anduvo?

MAFUS

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.

magictheory

Hola ahi subi las dos imagenes




Una es antes y otra es despues del bucle...