Problema Fwrite

Iniciado por kristian_5, 1 Junio 2013, 15:46 PM

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

kristian_5

Hola pues estoy haciendo un programa de una base de datos de una frutería utilizando ficheros. Mi problema es que el Fwrite no me lo acaba de hacer bien. Y ya me estoy desesperando un poco porque soy incapaz de ver la razón.

Haber si podéis echarme una mano! Gracias.   

Aquí dejo el código en principio solo es de la función.

La cuestión de esta función es hacer compras automáticas desde un archivo "comprasxx".txt le pongo "manzanas 2" y lo que debe hacer es aumentar el inventario.



void compra_auto( int cont){    
        char fichero[10];
        char fruta[20];
        int cantidad = 0;
        int existe = 0;
        int i;
        struct tfruteria frut;
       
        if ((loog = fopen("log.txt", "a+")) == NULL){
        printf ("Error en obertura del fitxer per a lectura.\n");
        }
       
        printf ("Dame el nombre del fichero: ");
        scanf ("%s", fichero);
       
        cmp = fopen (fichero, "r");
        if (!cmp){
        cmp = fopen("compras00.txt", "r");           
        printf ("No existe el archivo se cogera el archivo por defecto\n");
        fscanf (cmp, "%s  %d", fruta, &cantidad);
        fclose (cmp);
           
           if ((dat = fopen("fruites.dat", "rb+")) == NULL){
            } else{
            fflush(stdin);
            rewind(dat);
            fread (&frut, Mida, 1, dat);
            i=1;
            while (!feof(dat)){
                  if(strcmp(fruta,frut.nom)==0){
                       printf ("La fruta existe!!\n");             
                       existe ++;
                       fprintf(loog,"Compra;%d;OK;%d;%d;%d\n",i,frut.quantitat, cantidad, frut.quantitat+cantidad);
                       fclose (loog); 
                       frut.quantitat=frut.quantitat+cantidad;
                       printf ("Ahora el estoc de %s es de: %d", frut.nom, frut.quantitat);
                       } //if si fruta existe
                       i++;
                        fread (&frut, Mida, 1, dat);
                        }//while
            if(existe == 0){
            printf ("La fruta no existe!!\n");   
            }else if (existe == 1){
             rewind(dat);
                       if(fwrite(&frut, Mida,1, dat) == 1)       
                       printf("\n Fruita modificada!! ");     
                       }else{
                       printf("No he pogut escriure el registre al buffer del fitxer\n");
                       fclose (dat);
                       }
                       }
                                     
                    }else{
                     printf ("El fichero si que existe se realizara las opciones oportunas\n");
                    fscanf (cmp, "%s  %d", fruta, &cantidad);
        fclose (cmp);
           
           if ((dat = fopen("fruites.dat", "rb+")) == NULL){
            } else{
            fflush(stdin);
            rewind(dat);
            fread (&frut, Mida, 1, dat);
            while (!feof(dat)){
                  if(strcmp(fruta,frut.nom)==0){
                       printf ("La fruta existe!!\n");             
                       existe ++;
                       frut.quantitat=frut.quantitat+cantidad;
                       printf ("Ahora el estoc de %s es de: %d", frut.nom, frut.quantitat);
                       } //if si fruta existe
                        fread (&frut, Mida, 1, dat);
                        }//while
            if(existe == 0){
            printf ("La fruta no existe!!\n");   
            }else if (existe == 1){
           rewind(dat);
                       if(fwrite(&frut, Mida,1, dat) == 1)       
                       printf("\n Fruita modificada!! ");     
                       }else{
                       printf("No he pogut escriure el registre al buffer del fitxer\n");
                       fclose (dat);
                       }
                     }
                     }//else
                     }//funcion   
             
   



aguml

que lio de codigo, todo se ve sin identar al menos donde lo estoy viendo. De todos modos creo que si lo que quieres es simplemente leer un fichero en busca de un valor concreto y si existe incrementas x pues te sobra la mitad del codigo. Yo es que no termino de entender para que abres y cierras tanto los ficheros y para que tantos. Yo lo que haria seria abrir el fichero y primero de nada me iria al final del fichero y luego obtendria la posicion, eso se hace con fseek y ftell y el valor obtenido lo divido entre el tamaño de la estructura para obtener el numero de entradas y luego en un for uso ese valor como limite para buscar el nombre de la fruta usando fread para rellenar la estructura y luego si lo encuentra le sumo el valor que sea y como tengo el valor donde fue encontrado pues me posiciono ahi en el fichero y con fwrite machaco ese registro. Para hacerlo asi tienes que haber creado el fichero con el mismo formato que lo estes leyendo ya que si para crearlo usas fprint y para luego leerlo usas fread no te va a ir bien. Busca informacion sobre archivos de acceso aleatorio en C.

aguml

No he podido responderte antes. Prueba este codigo a ver si te sirve:

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

struct stRegistro {
   int ID;
   char nombre[25];
   int cantidad;
};

int Menu(void);
void ChangeStock(char *operacion, struct stRegistro *reg);
void MostrarCabecera(void);
void MostrarProducto(long n, struct stRegistro *reg);
long LeeNumero(void);
void Borrar(FILE **fa, long numero);
int Size(FILE **fa, int tam);
//--------------------------------------------------------------------------

int main()
{
   struct stRegistro reg;
   struct stRegistro aux;
   char nombre[25];
   FILE *fa;
   int i, opcion, nRegistros, encontrado, ID;
   long numero;
   fa = fopen("stock.dat", "r+b");          // Este modo permite leer y escribir
   if(!fa) fa = fopen("stock.dat", "w+b");  // si el fichero no existe, lo crea.
   do {
      opcion = Menu();
      switch(opcion) {
         case '1': // Añadir o incrementar el stock
            encontrado = 0;
            ChangeStock("Añadir al stock", &aux);
            nRegistros = Size(&fa, sizeof(struct stRegistro));
            for(i=0; i<nRegistros; i++)
            {
                fread(&reg,sizeof(struct stRegistro),1,fa);
                if(strcmp(aux.nombre, reg.nombre) == 0)
                {
                        reg.cantidad += aux.cantidad;
                        fseek(fa,i*sizeof(struct stRegistro),SEEK_SET);
                        fwrite(&reg, sizeof(struct stRegistro), 1, fa);
                        encontrado = 1;
                        break;
                }
            }
            if(encontrado == 0)
            {
                if(nRegistros == 0)
                        ID = 0;
                else
                {
                        fseek(fa, 0, nRegistros);
                        fread(&reg,sizeof(struct stRegistro), 1, fa);
                        ID = reg.ID + 1;
                }
                fseek(fa, 0, SEEK_END);
                aux.ID = ID;
                fwrite(&aux, sizeof(struct stRegistro), 1, fa);
            }
            break;
         case '2': // Ventas de stockaje
            encontrado = 0;
            ChangeStock("Venta de stockaje", &aux);
            nRegistros = Size(&fa, sizeof(struct stRegistro));
            fseek(fa, 0, SEEK_SET);
            for(i=0; i<nRegistros; i++)
            {
                fread(&reg,sizeof(struct stRegistro),1,fa);
                if(strcmp(aux.nombre, reg.nombre) == 0)
                {
                        encontrado = 1;
                        if(aux.cantidad <= reg.cantidad)
                        {
                                reg.cantidad -= aux.cantidad;
                                fseek(fa,i*sizeof(struct stRegistro),SEEK_SET);
                                fwrite(&reg, sizeof(struct stRegistro), 1, fa);
                        }else{
                                printf("No hay suficiente stockaje de ese producto para esta venta.\n");
                                MostrarCabecera();
                                MostrarProducto(i, &reg);
                                printf("|---------|-------------------------|--------|\n\n");
                                system("PAUSE");
                        }
                        break;
                }
            }
            if(encontrado == 0)
            {
                printf("No se puede encontrar el producto indicado.\n\n");
                system("PAUSE");
            }
            break;
         case '3': // Mostrar stock de un producto por su ID
            encontrado = 0;
            system("cls");
            printf("Buscar stock por ID: ");
            ID = LeeNumero();
            nRegistros = Size(&fa, sizeof(struct stRegistro));
            for(i=0; i<nRegistros; i++)
            {
                fread(&reg,sizeof(struct stRegistro),1,fa);
                if(ID == reg.ID)
                {
                        encontrado = 1;
                        MostrarCabecera();
                        MostrarProducto(i, &reg);
                        break;
                }
            }
            if(encontrado == 0)
            {
                printf("No se puede encontrar el producto indicado.\n\n");
            }
            else
            {
                printf("|---------|-------------------------|--------|\n\n");
            }
            system("PAUSE");
            break;
         case '4': // Mostrar stock de un producto por su nombre
            encontrado = 0;
            system("cls");
            printf("Buscar stock por nombre: ");
            fgets(nombre,25,stdin);
            for(i = strlen(nombre)-1; i && nombre[i] < ' '; i--)
                nombre[i] = 0;
            nRegistros = Size(&fa, sizeof(struct stRegistro));
            for(i=0; i<nRegistros; i++)
            {
                fread(&reg,sizeof(struct stRegistro),1,fa);
                if(strcmp(nombre, reg.nombre) == 0)
                {
                        encontrado = 1;
                        MostrarCabecera();
                        MostrarProducto(i, &reg);
                        break;
                }
            }
            if(encontrado == 0)
            {
                printf("No se puede encontrar el producto indicado.\n\n");
                system("PAUSE");
            }
            else
            {
                printf("|---------|-------------------------|--------|\n\n");
            }
            system("PAUSE");
            break;
         case '5': // Mostrar todo el stockaje
            encontrado = 0;
            rewind(fa);
            numero = 0;
            system("cls");
            nRegistros = Size(&fa,sizeof(struct stRegistro));
            if(nRegistros > 0)
            {
                encontrado = 1;
                MostrarCabecera();
                for(i = 0; i < nRegistros; i++)
                {
                        fread(&reg, sizeof(struct stRegistro), 1, fa);
                        MostrarProducto(numero++, &reg);
                }
            }
            if(encontrado == 0)
            {
                printf("No existen entradas en el registro.\n");
            }
            else
            {
                printf("|---------|-------------------------|--------|\n\n");
            }
            system("PAUSE");
            break;
         case '6': // Eliminar del stock
            system("cls");
            printf("Eliminar del stock: ");
            numero = LeeNumero();
            Borrar(&fa, numero);
            break;
      }
   } while(opcion != '0');
   fclose(fa);
   return 0;
}
//--------------------------------------------------------------------------

// Muestra un menú con las opciones disponibles y captura una opción del usuario
int Menu()
{
   char resp[20];
   do {
      system("cls");
      printf("MENU PRINCIPAL\n");
      printf("--------------\n\n");
      printf("1- Añadir al stock\n");
      printf("2- Venta\n");
      printf("3- Buscar stock por su ID\n");
      printf("4- Buscar stock por su nombre\n");
      printf("5- Mostrar todo el stockaje\n");
      printf("6- Eliminar producto del stock por su ID\n");
      printf("0- Salir\n");
      fgets(resp, 20, stdin);
   } while(resp[0] < '0' && resp[0] > '6');
   return resp[0];
}
//--------------------------------------------------------------------------

// Permite que el usuario introduzca un producto por pantalla
void ChangeStock(char * operacion, struct stRegistro *reg)
{
   int i;
   char numero[6];
   system("cls");
   printf("%s:", operacion);
   printf("\n\n");
   printf("Nombre: ");
   fgets(reg->nombre, 25, stdin);
   // la función fgets captura el retorno de línea, hay que eliminarlo:
   for(i = strlen(reg->nombre)-1; i && reg->nombre[i] < ' '; i--)
      reg->nombre[i] = 0;
   printf("Cantidad: ");
   fgets(numero, 6, stdin);
   reg->cantidad = atoi(numero);
}
//--------------------------------------------------------------------------

// Muestra la cabecera de la tabla por pantalla
void MostrarCabecera(void)
{
   printf("\n");
   printf("|---------|-------------------------|--------|\n"
          "|ID       |Nombre                   |Cantidad|\n"
          "|---------|-------------------------|--------|\n");
}
//--------------------------------------------------------------------------

// Muestra un producto por pantalla
void MostrarProducto(long n, struct stRegistro *reg)
{
        printf("|[%6ld] |%-25s| %4d   |\n", reg->ID, reg->nombre, reg->cantidad);
}
//--------------------------------------------------------------------------

// Lee un número suministrado por el usuario
long LeeNumero()
{
   char numero[6];
   fgets(numero, 6, stdin);
   return atoi(numero);
}
//--------------------------------------------------------------------------

// Borra una entrada del archivo
void Borrar(FILE **fa, long numero)
{
        struct stRegistro reg;
        FILE *ftemp;
        int largo, nRegistros, i;
        rewind(*fa);
        ftemp = fopen("temp.dat", "wb");
        nRegistros = Size(*&fa,sizeof(struct stRegistro));
        for(i=0; i<nRegistros; i++)
        {
                fread(&reg,sizeof(struct stRegistro),1,*fa);
                if(numero != reg.ID)
                {
                        fwrite(&reg, sizeof(struct stRegistro), 1, ftemp);
                }
        }
        fclose(ftemp);
        fclose(*fa);
        remove("stock.dat");
        rename("temp.dat", "stock.dat");
        *fa = fopen("stock.dat", "r+b");
}
//--------------------------------------------------------------------------

int Size(FILE **fa, int tam)
{
        int largo, n;
        fseek(*fa, 0, SEEK_END);
        largo = ftell(*fa);
        n = largo / tam;
        fseek(*fa, 0, SEEK_SET);
        return n;
}
//--------------------------------------------------------------------------