#include <stdio.h>#include <string.h>struct libro {char codigo[5];int cant;char descripcion[25];} ;void main (void) /*main altas y reposición*/{FILE *biblioteca, *compras, *actualizado; int n,m;struct libro rb, rc;biblioteca= fopen("bibliote","wb");printf("Ingrese la cantidad de libros: ");scanf("%d",&n);while(n--) { fflush(stdin); printf("\nIngrese codigo y cantidad por cada libro: "); scanf("%s %d",rb.codigo, &rb.cant); fwrite(&rb, sizeof(struct libro), 1,biblioteca); }fclose(biblioteca);compras= fopen("compras","wb");printf("\nIngrese la cantidad de compras: ");scanf("%d",&m);while(m--) { fflush(stdin); printf("\nIngrese codigo y cantidad de compras: "); scanf("%s %d",rc.codigo, &rc.cant); fwrite(&rc, sizeof(struct libro), 1,compras); }fclose(compras);Muchas gracias. Saludosbiblioteca=fopen("bibliote","rb");compras=fopen("compras", "rb");actualizado=fopen("actualiz", "wb");fread(&rb,sizeof(struct libro),1,biblioteca);fread(&rc,sizeof(struct libro),1,compras);while (! feof(biblioteca) || !feof(compras))if(strcmp(rb.codigo, rc.codigo)<0) { /*rb no se modifica*/fwrite(&rb,sizeof(struct libro),1,actualizado);fread(&rb,sizeof(struct libro),1,biblioteca);}elseif(strcmp(rb.codigo, rc.codigo)>0) { /*rb no se modifica*/fwrite(&rc, sizeof(struct libro),1,actualizado);fread(&rc,sizeof(struct libro),1,compras);}else /*son iguales los códigos*/{rb.cant += rc.cant;fwrite(&rb,sizeof(struct libro),1,actualizado);fread(&rb,sizeof(struct libro),1,biblioteca);fread(&rc,sizeof(struct libro),1,compras);}fclose(biblioteca); fclose(compras) ;fclose( actualizado);}
while (! feof(biblioteca) && !feof(compras))
Utilizo while (! feof(biblioteca) || !feof(compras)) para resolver el problema dentro de un único ciclo y al finalizar un archivo no se detenga el cilco, al menos así nos ensñaron.
//leer archivovoid readFile(FILE * libreryFile){ struct libro rb; long oldPosition = ftell(libreryFile); fseek(libreryFile, 0L, SEEK_SET); printf("Muestro archivo de biblioteca\n"); printf("codigo ---------- cantidad\n"); while (! feof(libreryFile) ){ fread(&rb,sizeof(struct libro),1,libreryFile); printf("%s ---------- %d\n", rb.codigo, rb.cant); } fseek(libreryFile, oldPosition, SEEK_SET);}
biblioteca=fopen("bibliote","rb"); compras=fopen("compras", "rb"); actualizado=fopen("actualiz", "wb"); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); while (! feof(biblioteca) && !feof(compras)){ if(strcmp(rb.codigo, rc.codigo) < 0) { fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } else { if(strcmp(rb.codigo, rc.codigo) > 0) { fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } else /*son iguales los códigos*/ { rb.cant += rc.cant; fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); } } } while (! feof(biblioteca) ){ fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } while ( !feof(compras)){ fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); }
fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); while (! feof(biblioteca) || !feof(compras)){ if( feof(biblioteca) ^ feof(compras) ) { if( ! feof(biblioteca) ){ fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } else { fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } } else { if(strcmp(rb.codigo, rc.codigo) < 0) { fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } else { if(strcmp(rb.codigo, rc.codigo) > 0) { fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } else /*son iguales los códigos*/ { rb.cant += rc.cant; fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); } } } }
#include <stdio.h>#include <string.h>struct libro { char codigo[5]; int cant; char descripcion[25];} ;void readFile(FILE * libreryFile);void main (void) /*main altas y reposición*/{ FILE *biblioteca, *compras, *actualizado; int n,m; struct libro rb, rc; biblioteca= fopen("bibliote","wb"); printf("Ingrese la cantidad de libros: "); scanf("%d",&n); while(n--) { fflush(stdin); printf("\nIngrese codigo y cantidad por cada libro: "); scanf("%s %d",rb.codigo, &rb.cant); fwrite(&rb, sizeof(struct libro), 1,biblioteca); } fclose(biblioteca); compras= fopen("compras","wb"); printf("\nIngrese la cantidad de compras: "); scanf("%d",&m); while(m--) { fflush(stdin); printf("\nIngrese codigo y cantidad de compras: "); scanf("%s %d",rc.codigo, &rc.cant); fwrite(&rc, sizeof(struct libro), 1,compras); } fclose(compras); printf("Muchas gracias. Saludos\n"); biblioteca=fopen("bibliote","rb"); compras=fopen("compras", "rb"); actualizado=fopen("actualiz", "wb"); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); while (! feof(biblioteca) && !feof(compras)){ if(strcmp(rb.codigo, rc.codigo) < 0) { fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } else { if(strcmp(rb.codigo, rc.codigo) > 0) { fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } else /*son iguales los códigos*/ { rb.cant += rc.cant; fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); } } } while (! feof(biblioteca) ){ fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } while ( !feof(compras)){ fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } //aca leo lo obtenido readFile(actualizado); fclose(biblioteca); fclose(compras) ;fclose( actualizado);}void readFile(FILE * libreryFile){ struct libro rb; long oldPosition = ftell(libreryFile); fseek(libreryFile, 0L, SEEK_SET); printf("Muestro archivo de biblioteca\n"); printf("codigo ---------- cantidad\n"); while (! feof(libreryFile) ){ fread(&rb,sizeof(struct libro),1,biblioteca); printf("%s ---------- %d\n", rb.codigo, rb.cant); } fseek(libreryFile, oldPosition, SEEK_SET);}
pero ahora cuando lo ejecuto deja de funcionar,
#include <stdio.h>#include <string.h>struct libro { char codigo[5]; int cant; char descripcion[25];} ;void readFile(FILE * libreryFile);int main(int argc, char **argv) /*main altas y reposición*/{ FILE *biblioteca, *compras, *actualizado; int n,m; struct libro rb, rc; rb.codigo[0] = '\0';//inicializo en NULL rc.codigo[0] = '\0'; int clean = 0; biblioteca= fopen("bibliote","w+b"); printf("Ingrese la cantidad de libros: \n"); scanf("%d",&n); while(getc(stdin) != '\n') ; while(n--) { printf("Ingrese codigo : \n"); fgets(rb.codigo, 5, stdin); while(getc(stdin) != '\n'); printf("Ingrese cantidad por cada libro: \n"); scanf("%d", &rb.cant); while(getc(stdin) != '\n') ; printf("El codigo es: %s la cantidad es: %d \n", rb.codigo, rb.cant); fwrite(&rb, sizeof(struct libro), 1,biblioteca); } printf("El puntero : %p \n", biblioteca); //aca leo lo obtenido readFile(biblioteca); fclose(biblioteca); printf("--------------------------------------------\n"); compras= fopen("compras","w+b"); printf("\nIngrese la cantidad de compras: \n"); scanf("%d",&m); while(getc(stdin) != '\n') ; while(m--) { printf("Ingrese codigo compras: \n"); fgets(rc.codigo, 5, stdin); while(getc(stdin) != '\n'); printf("Ingrese cantidad compras: \n"); scanf("%d", &rc.cant); while(getc(stdin) != '\n'); printf("El codigo es: %s la cantidad es: %d \n", rc.codigo, rc.cant); fwrite(&rc, sizeof(struct libro), 1,compras); } //aca leo lo obtenido readFile(compras); fclose(compras); printf("--------------------------------------------\n"); biblioteca=fopen("bibliote","rb"); compras=fopen("compras", "rb"); actualizado=fopen("actualiz", "w+b"); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); while (! feof(biblioteca) && !feof(compras)){ if(strcmp(rb.codigo, rc.codigo) < 0) { fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } else { if(strcmp(rb.codigo, rc.codigo) > 0) { fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } else //son iguales los códigos { rb.cant += rc.cant; fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); fread(&rc,sizeof(struct libro),1,compras); } } } while (! feof(biblioteca) ){ fwrite(&rb,sizeof(struct libro),1,actualizado); fread(&rb,sizeof(struct libro),1,biblioteca); } while ( !feof(compras)){ fwrite(&rc, sizeof(struct libro),1,actualizado); fread(&rc,sizeof(struct libro),1,compras); } //aca leo lo obtenido readFile(actualizado); fclose(biblioteca); fclose(compras) ;fclose( actualizado); return 0;}void readFile(FILE * libreryFile){ struct libro rb; fpos_t oldPosition ; printf("El puntero : %p \n", libreryFile); fgetpos(libreryFile, &oldPosition); rewind(libreryFile); printf("Muestro archivo de biblioteca\n"); printf("codigo ---------- cantidad\n"); while ( !feof(libreryFile) ){ if( fread(&rb, sizeof(struct libro),1,libreryFile) ){ //si tubo exito retorna 1, sino 0 printf("%s ---------- %d\n", rb.codigo, rb.cant); } } fsetpos(libreryFile, &oldPosition);}