| 
	
		|  Autor | Tema: Problema Fwrite  (Leído 3,071 veces) |  
	| 
			| 
					
						| kristian_5 
								
								 Desconectado 
								Mensajes: 1
								
								
								
								
								
								   | 
 
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
 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| aguml 
								 
								
								 Desconectado 
								Mensajes: 378
								
								   | 
 
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. 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| aguml 
								 
								
								 Desconectado 
								Mensajes: 378
								
								   | 
 
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(®,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(®, sizeof(struct  stRegistro), 1,  fa);                        encontrado = 1;                        break;                }            }            if(encontrado == 0)            {                if(nRegistros == 0)                        ID = 0;                else                {                        fseek(fa, 0,  nRegistros);                        fread(®,sizeof(struct  stRegistro), 1,  fa);                        ID = reg.ID + 1;                }                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));            for(i=0; i<nRegistros; i++)            {                fread(®,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(®, sizeof(struct  stRegistro), 1,  fa);                        }else{                                printf("No hay suficiente stockaje de ese producto para esta venta.\n");                                MostrarCabecera();                                MostrarProducto(i, ®);                                printf("|---------|-------------------------|--------|\n\n");                        }                        break;                }            }            if(encontrado == 0)            {                printf("No se puede encontrar el producto indicado.\n\n");            }            break;         case '3': // Mostrar stock de un producto por su ID            encontrado = 0;            printf("Buscar stock por ID: ");            ID = LeeNumero();            nRegistros = Size(&fa, sizeof(struct stRegistro));            for(i=0; i<nRegistros; i++)            {                fread(®,sizeof(struct  stRegistro),1, fa);                if(ID == reg.ID)                {                        encontrado = 1;                        MostrarCabecera();                        MostrarProducto(i, ®);                        break;                }            }            if(encontrado == 0)            {                printf("No se puede encontrar el producto indicado.\n\n");            }            else            {                printf("|---------|-------------------------|--------|\n\n");            }            break;         case '4': // Mostrar stock de un producto por su nombre            encontrado = 0;            printf("Buscar stock por nombre: ");            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(®,sizeof(struct  stRegistro),1, fa);                if(strcmp(nombre,  reg.nombre) == 0)                {                        encontrado = 1;                        MostrarCabecera();                        MostrarProducto(i, ®);                        break;                }            }            if(encontrado == 0)            {                printf("No se puede encontrar el producto indicado.\n\n");            }            else            {                printf("|---------|-------------------------|--------|\n\n");            }            break;         case '5': // Mostrar todo el stockaje            encontrado = 0;            numero = 0;            nRegistros = Size(&fa,sizeof(struct stRegistro));            if(nRegistros > 0)            {                encontrado = 1;                MostrarCabecera();                for(i = 0; i < nRegistros; i++)                {                        fread(®, sizeof(struct  stRegistro), 1,  fa);                        MostrarProducto(numero++, ®);                }            }            if(encontrado == 0)            {                printf("No existen entradas en el registro.\n");            }            else            {                printf("|---------|-------------------------|--------|\n\n");            }            break;         case '6': // Eliminar del stock            printf("Eliminar del stock: ");            numero = LeeNumero();            Borrar(&fa, numero);            break;      }   } while(opcion != '0');   return 0;}//-------------------------------------------------------------------------- // Muestra un menú con las opciones disponibles y captura una opción del usuarioint Menu(){   char resp[20];   do {      printf("1- Añadir al stock\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");   } while(resp[0] < '0' && resp[0] > '6');   return resp[0];}//-------------------------------------------------------------------------- // Permite que el usuario introduzca un producto por pantallavoid ChangeStock(char * operacion, struct stRegistro *reg){   int i;   char numero[6];   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;   reg-> cantidad = atoi( numero);}//-------------------------------------------------------------------------- // Muestra la cabecera de la tabla por pantallavoid MostrarCabecera(void){   printf("|---------|-------------------------|--------|\n"          "|ID       |Nombre                   |Cantidad|\n"          "|---------|-------------------------|--------|\n");}//-------------------------------------------------------------------------- // Muestra un producto por pantallavoid MostrarProducto(long n, struct stRegistro *reg){        printf("|[%6ld] |%-25s| %4d   |\n", reg-> ID,  reg-> nombre,  reg-> cantidad);}//-------------------------------------------------------------------------- // Lee un número suministrado por el usuariolong LeeNumero(){   char numero[6];}//-------------------------------------------------------------------------- // Borra una entrada del archivovoid Borrar(FILE **fa, long numero){        struct stRegistro reg;        FILE *ftemp;        int largo, nRegistros, i;        ftemp = fopen("temp.dat", "wb");        nRegistros = Size(*&fa,sizeof(struct stRegistro));        for(i=0; i<nRegistros; i++)        {                fread(®,sizeof(struct  stRegistro),1,* fa);                if(numero != reg.ID)                {                        fwrite(®, sizeof(struct  stRegistro), 1,  ftemp);                }        }        rename("temp.dat", "stock.dat");        *fa = fopen("stock.dat", "r+b");}//-------------------------------------------------------------------------- int Size(FILE **fa, int tam){        int largo, n;        n = largo / tam;        return n;}//-------------------------------------------------------------------------- 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | Problemas con fwrite() PHP
 | eLank0 | 2 | 2,276 |  17 Enero 2007, 01:57 am por eLank0
 |  
						|   |   | no me deja utilizar fwrite PHP
 | CICOLO_111234 | 2 | 2,472 |  23 Abril 2009, 18:20 pm por дٳŦ٭
 |  
						|   |   | Problema para pasar una lista a fichero con Fwrite
							« 1 2 » Programación C/C++
 | samur88 | 12 | 9,211 |  21 Febrero 2011, 01:06 am por samur88
 |  
						|   |   | fread y fwrite con clases Programación C/C++
 | newone | 4 | 5,189 |  23 Junio 2011, 23:40 pm por newone
 |  
						|   |   | Usos fwrite, fread Programación C/C++
 | diegoCmC | 4 | 6,018 |  13 Septiembre 2012, 21:42 pm por diegoCmC
 |    |