Autor
|
Tema: Problema Fwrite (Leído 2,657 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 usuario int 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 pantalla void 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 pantalla void MostrarCabecera(void) { 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]; } //-------------------------------------------------------------------------- // Borra una entrada del archivo void 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,064
|
17 Enero 2007, 01:57 am
por eLank0
|
|
|
no me deja utilizar fwrite
PHP
|
CICOLO_111234
|
2
|
2,291
|
23 Abril 2009, 18:20 pm
por дٳŦ٭
|
|
|
Problema para pasar una lista a fichero con Fwrite
« 1 2 »
Programación C/C++
|
samur88
|
12
|
8,389
|
21 Febrero 2011, 01:06 am
por samur88
|
|
|
fread y fwrite con clases
Programación C/C++
|
newone
|
4
|
4,884
|
23 Junio 2011, 23:40 pm
por newone
|
|
|
Usos fwrite, fread
Programación C/C++
|
diegoCmC
|
4
|
5,580
|
13 Septiembre 2012, 21:42 pm
por diegoCmC
|
|