Archivos: altas,bajas y modificaciones en c (consulta)

Iniciado por mauropereyra, 16 Septiembre 2016, 00:20 AM

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

mauropereyra

Buenas gente, estoy haciendo un programa muy simple para hacer altas bajas y modificaciones en un archivo en c usando registros. Mi problema es que no me funciona la parte en que tendria que dar de baja y la de modificar, les dejo mi programa y espero me puedan ayudar. Desde ya muchas gracias!


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void darbaja();
typedef struct{
   int dni;
   char nombre[30];
   char apellido[30];

}Empleados;
int main()
{


   int opcion=0;

   while(opcion<5){ printf("1_dar de alta\n");
   printf("2_dar de baja\n");
   printf("3_modificar\n");
   printf("4_Imprimir\n");
   scanf("%d",&opcion);
   switch (opcion)
   {

      case 1:daralta();break;
      case 2:darbaja();break;
      case 3:modificar();break;
      case 4:imprimir();break;

   }
   }
   return 0;
}
void daralta()
{
  char nombre[30];
   FILE* miarchivo=NULL;
   Empleados e;
   miarchivo=fopen("Empleados.txt","a+");
   if(miarchivo==NULL)return;
   printf("Ingrese DNi del empleado\n");
   scanf("%d",&e.dni);
   printf("Ingrese nombre del empleado\n");
   scanf("%s",&e.nombre);
   printf("Ingrese apellido del empleado\n");
   scanf("%s",&e.apellido);
   fflush(stdin);
   fseek(miarchivo,0L,SEEK_END);
   fwrite(&e,sizeof(Empleados),1,miarchivo);
   fclose(miarchivo);

}

void imprimir()
{

   FILE* miarchivo=NULL;
   Empleados e;
   miarchivo=fopen("Empleados.txt","r");
   fread(&e,sizeof(Empleados),1,miarchivo);
   if(miarchivo==NULL)return ;

   while(feof(miarchivo)==0)
   {
       printf("DNI:%d Nombre:%s Apellido:%s\n",e.dni,e.nombre,e.apellido);
       fread(&e,sizeof(Empleados),1,miarchivo);
   }
   fclose(miarchivo);


}
void darbaja()
{
   FILE* miarchivo=NULL;
   FILE* miarchivouxiliar=NULL;
   int dniaux;
   Empleados e;
   miarchivo=fopen("Empleados.txt","a+");
   miarchivo=fopen("Empleadosaux.txt","a+");
   printf("Ingrese el dni del empleado\n");
   scanf("%i",&dniaux);

   fread(&e,sizeof(Empleados),1,miarchivo);
   printf("dniaux:%i|dni:%i\n",dniaux,e.dni);
   while(!feof(miarchivo))
   {
       if(e.dni!=dniaux)
       {
           fseek(miarchivouxiliar,0l,SEEK_END);
           fwrite(&e,sizeof(Empleados),1,miarchivouxiliar);
       }

       fread(&e,sizeof(Empleados),1,miarchivo);
       printf("dniaux:%d|dni:%d\n",dniaux,e.dni);
   }
   
   fclose(miarchivo);
   fclose(miarchivouxiliar);
   remove("Empleados.txt");
   rename("Empleadosaux.txt","Empleados.txt");
}
void modificar()
{
   int dniaux;

   FILE* miarchivo=NULL;
   FILE* miarchivouxiliar=NULL;
   Empleados e;
   miarchivo=fopen("Empleados.txt","a+");
   miarchivo=fopen("Empleadosaux.txt","a+");
   printf("Ingrese el dni del guachin\n");
   scanf("%i",&dniaux);
   fread(&e,sizeof(Empleados),1,miarchivo);
   printf("dniaux:%d|dni:%d\n",dniaux,e.dni);
   while(feof(miarchivo)==0)
   {
       if(e.dni!=dniaux)
       {
fseek(miarchivouxiliar,0l,SEEK_END);
           fwrite(&e,sizeof(Empleados),1,miarchivouxiliar);
       }
       else
       {
   printf("Ingrese DNi del empleado\n");
   scanf("%d",&e.dni);
   printf("Ingrese nombre del empleado\n");
   scanf("%s",&e.nombre);
   printf("Ingrese apellido del empleado\n");
   scanf("%s",&e.apellido);
   fflush(stdin);
   fseek(miarchivouxiliar,0l,SEEK_END);
   fwrite(&e,sizeof(Empleados),1,miarchivo);
       }

       fread(&e,sizeof(Empleados),1,miarchivo);
   }
   fclose(miarchivo);
   fclose(miarchivouxiliar);
   remove("Empleados.txt");
   rename("Empleadosaux.txt","Empleados.txt");
}





MOD: Etiquetas de Código GeSHi insertadas

Nacko

#1
Este post es viejisimo pero si alguien ve esto me gustaria que me consten una pregunta ¿Como hago el mismo ejercicio pero ahora usando como clave una variable del tipo int? Me explico un poco mas si ahora en vez de tener que ingresar un Nombre me pidieran ingresar un codigo y que ese codigo sea la clave para dar de baja o modificar un dato.

------------------------------------------------------------------------------------------------------------------

Ya esta, lo resolví.  ::)

------------------------------------------------------------------------------------------------------------------

Dejo mi resolución por si a alguien le sirve:  ;D

------------------------------------------------------------------------------------------------------------------


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>


typedef struct {
   int codigo;
   char descripcion[60];
   char fecha[9];
   int pagado;
} registro;


void alta();
int baja();
void modificaciones();
void consultas();
int eliminarRegistro(int);
void IngresarRegistro(int);
int buscar(char[80]);
void ingresarClave(char[80]);
void grabar();
void leer();
int cantidad = 0;

registro registros[100];
FILE* archivo;

int main() {

   int op;
   do {
       system("cls");
       printf("[0] Salir\n");
       printf("[1] Alta\n");
       printf("[2] Baja\n");
       printf("[3] Modificacion\n");
       printf("[4] Consulta\n");
       printf("[5] Grabar\n");
       printf("[6] Leer\n");
       scanf("%d", &op);
       system("cls");
       switch (op)
       {
       case 1: printf("[1] Ingrese los datos del pago de la factura de un Usuario para darlos de alta:\n");
           alta();
           break;
       case 2: printf("[2] Ingrese el codigo de la facturacion que quiere dar de baja de la lista junto con todos sus datos:\n");
           baja();
           break;
       case 3: printf("[3] Ingrese el codigo de la facturacio al cual le quiere modificar todos sus datos, inclusive el mismo codigo: \n");
           modificaciones();
           break;
       case 4: printf("[4] Aca se refleja la lista de codigos facturados con sus respectivos datos: \n");
           consultas();
           break;
       case 5: printf("[5] Usted selecciono la opcion de guardar sus datos en una unidad pendrive: \n");
           grabar();
           break;
       case 6:printf("[6] Usted selecciono la opcion de leer los datos guardados: \n");
           leer();
           break;
       case 0: printf("Gracias por usar el programa! Vuelva pronto.\n");
           break;
       default:
           printf("Opcion invalida! La opcion [%d] no existe\n", op);
           printf("\n");
           system("PAUSE");
           break;
       }

   } while (op != 0);
}

void alta() {
   if (cantidad <= 100) {
       IngresarRegistro(cantidad);
       cantidad++;
       system("cls");
   }
   else {
       printf("Se ocuparon todos los espacios disponible.\n");
       printf("IMPOSIBLE agregar otro registro.");
   }
}

void IngresarRegistro(int posicion) {
   printf("\nIngrese un codigo de facturacion: ");
   scanf("%d", &registros[posicion].codigo);
   printf("\nIngrese la descripcion de la facturacion: ");
   scanf("%s", registros[posicion].descripcion);                 //NOTA PERSONAL: Solo se usa el "&" cuando es un int
   printf("\nIngrese la fecha de facturacion: ");
   scanf("%s", registros[posicion].fecha);
   printf("\nIngrese 1 si se pago la factura y 2 si no: ");
   scanf("%d", &registros[posicion].pagado);
   while (registros[posicion].pagado > 2 || registros[posicion].pagado < 1) {
       printf("\nReingrese el pàgo. 1 si se pago la factura y 2 si no: ");
       scanf("%d", &registros[posicion].pagado);
   }
}

int baja() {
   int codigo;
   printf("\nIngrese el codigo: ");
   scanf("%d", &codigo);
   int indice = buscar(codigo);
   if (indice != -1) {
       eliminarRegistro(indice);
   }
   else {
       printf("%d No se encuentra dado de Alta \n", codigo);
       system("PAUSE");
   }

   return indice;
}


int buscar(int codigo) {
   int i = cantidad-1;
   for (; i > -1 && codigo != registros[i].codigo; i--);
   return i;
}

int eliminarRegistro(int eliminar) {
   for (int c = eliminar; c < cantidad; c++)
       registros[c] = registros[c + 1];
   cantidad--;

}

void modificaciones() {
   int codigo;
   printf("\nIngrese el codigo: ");
   scanf("%i", &codigo);
   int indice = buscar(codigo);
   if (indice != -1) {
       IngresarRegistro(indice);
   }
   else {
       printf("%d  --> No se encuentra dado de Alta \n", codigo);
       system("PAUSE");
   }


   return indice;
}

void consultas() {
   printf("                        Codigo  ||  Descripcion  ||  Fecha || .Pagado?)\n");
   for (int i = 0; i < cantidad; i++) {
       printf("%27d %15s %15s %6d\n", registros[i].codigo, registros[i].descripcion, registros[i].fecha, registros[i].pagado);
   }
   system("PAUSE");
   system("cls");
}

void grabar() {
   printf("\nGrabando...\n");
   archivo = fopen("E:\Registros de Facturacion.txt", "wb");
   fwrite(registros, sizeof(registro), cantidad, archivo);
   fclose(archivo);
   printf("\n Grabacion Finalizada\n");
   system("PAUSE");
}

void leer() {
   printf("\nDentro del Archivo se puede ver:\n");
   archivo = fopen("E:\Registros de Facturacion.txt", "rb");
   cantidad = 0;
   while (fread(&registros[cantidad], sizeof(registros[cantidad]), 1, archivo) == 1) {
       cantidad++;
   }
   fclose(archivo);
   consultas();
}





MOD: Etiquetas de Código GeSHi insertadas