|
41
|
Programación / Programación C/C++ / Crear registro
|
en: 17 Febrero 2015, 02:17 am
|
Hola, hoy tenía una duda. Quiero crear un registro dependiendo de cuantos campos escriba el usuario.
Ejemplo:
El usuario ingresa que quiere un registro de 5 enteros. Como hago para crear un registro dependiendo de lo que escribe el usuario?
Saludos
|
|
|
42
|
Programación / Programación C/C++ / Re: Problema - Registros y archivos
|
en: 6 Noviembre 2014, 13:19 pm
|
Termine de editarlo y le agregue un fclose mas que me faltaba, pero sigue tirando el mismo error :S #include <stdio.h> #include <stdlib.h> typedef struct { int legajo; char CUIL[13]; char nombre[31]; char apellido[31]; char sexo[3]; char categoria[3]; char obrasocial[51]; float sueldo; char activo[2]; } registro; /*****************************************************************************/ void CargarRegistro() { registro reg; FILE *archivo; archivo = fopen("empleados.dat", "a"); if(archivo == NULL) { printf("No se pudo abrir el archivo\n"); return; } printf("Ingrese CUIL (Formato xx-xxxxxxxxxx): \n"); scanf("%s", reg.CUIL); printf("Ingrese Nombre: \n"); scanf("%s", reg.nombre); printf("Ingrese Apellido: \n"); scanf("%s", reg.apellido); printf("Ingrese sexo: \n"); scanf("%s", reg.sexo); printf("Ingrese categoria: \n"); scanf("%s", reg.categoria); printf("Ingrese Obra social: \n"); scanf("%s", reg.obrasocial); printf("Ingrese sueldo: \n"); scanf("%f", ®.sueldo); reg.activo[0] = '1'; fwrite(®, sizeof(registro), 1, archivo); fclose(archivo); return; } void Alta(registro datos) { int legajo = 0, encontrado = 0; FILE *archivo; printf("Ingrese un numero de legajo (0 para salir): \n"); scanf("%d", &legajo); while(legajo != 0) { archivo = fopen("empleados.dat", "r"); if(archivo == NULL) { printf("No se pudo abrir el archivo\n"); return; } fread(&datos, sizeof(registro), 1, archivo); while((!feof(archivo)) && (encontrado == 0)) { if(datos.legajo == legajo) { encontrado = 1; fclose(archivo); } fread(&datos, sizeof(registro), 1, archivo); } if(encontrado == 1) { printf("El legajo ya existe\n"); return; } else { fclose(archivo); CargarRegistro(); } return; } } /*****************************************************************************/ void Baja(registro datos) { int legajo = 0; int confirmar = 0; FILE *archivo; printf("Ingrese un numero de legajo (0 para salir): \n"); scanf("%d", &legajo); while(legajo != 0) { archivo = fopen("empleados.dat", "r+"); if(archivo == NULL) { printf("No se pudo abrir el archivo\n"); return; } fread(&datos, sizeof(registro), 1, archivo); while(!feof(archivo)) { if((datos.legajo == legajo) && (datos.activo[0] == '1')) { printf("Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n"); scanf("%d", &confirmar); while((confirmar != 0) && (confirmar != 1)) { printf("Opcion incorrecta. Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n"); scanf("%d", &confirmar); } switch(confirmar) { case 1: datos.activo[0] = '0'; fwrite(&datos, sizeof(registro), 1, archivo); fclose(archivo); return; break; case 2: return; break; } } fread(&datos, sizeof(registro), 1, archivo); } fclose(archivo); } } /*****************************************************************************/ int OpcionModif(registro reg, int x) { printf("Datos del empleado a modificar:\n"); printf("%d\n", reg.legajo); printf("%s\n", reg.CUIL); printf("%s\n", reg.nombre); printf("%s\n", reg.apellido); printf("%s\n", reg.sexo); printf("%s\n", reg.categoria); printf("%s\n", reg.obrasocial); printf("%f\n", reg.sueldo); printf("%s\n", reg.activo); printf("Elija que dato desea modificar\n"); printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n"); scanf("%d", &x); while( (x < 0) && (x > 5) ) { printf("Elija que dato desea modificar\n"); printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n"); scanf("%d", &x); } return x; } void Modificar(registro datos) { int legajo = 0, opc = 0; FILE *archivo; printf("Ingrese un numero de legajo (0 para salir): \n"); scanf("%d", &legajo); while(legajo != 0) { archivo = fopen("empleados.dat", "r+"); if(archivo == NULL) { printf("No se pudo abrir el archivo\n"); return; } fread(&datos, sizeof(registro), 1, archivo); while(!feof(archivo)) { if((datos.legajo == legajo) && (datos.activo[0] = '1')) { opc = OpcionModif(datos, opc); switch(opc) { case 1: printf("Ingrese el sexo:\n"); scanf("%s", datos.sexo); break; case 2: printf("Ingrese categoria:\n"); scanf("%s", datos.categoria); break; case 3: printf("Ingrese Obra Social:\n"); scanf("%s", datos.obrasocial); break; case 4: printf("Ingrese sueldo:\n"); scanf("%f", &datos.sueldo); break; } fwrite(&datos, sizeof(registro), 1, archivo); fclose(archivo); return; } fread(&datos, sizeof(registro), 1, archivo); } } printf("El legajo no existe\n"); fclose(archivo); } /*****************************************************************************/ int main() { int opcmenu = 1; registro empleados; FILE *archivo; while((opcmenu > 0) && (opcmenu < 7)) { printf("Seleccione entre una de las opciones disponibles\n"); printf("[ 1 ] - Altas\n[ 2 ] - Bajas\n[ 3 ] - Modificacion\n[ 4 ] - Listado\n[ 5 ] - Aumentar salario\n[ 6 ] - Buscar por legajo\n[ 7 ] - Salir\n"); scanf("%d", &opcmenu); switch(opcmenu) { case 1: Alta(empleados); break; case 2: Baja(empleados); break; case 3: Modificar(empleados); break; case 7: return -1; break; } } return 0; }
|
|
|
43
|
Programación / Programación C/C++ / Re: Problema - Registros y archivos
|
en: 6 Noviembre 2014, 12:47 pm
|
Muchas gracias por las respuestas. El único problema que me queda es que en bajas y en modificación no se abre el archivo, ya teniendolo creado... No logré encontrar el error, ya que en Altas me abre y carga perfecto pero en Bajas y modificación no, y esta tal cual.
Saludos
|
|
|
44
|
Programación / Programación C/C++ / Problema - Registros y archivos
|
en: 5 Noviembre 2014, 22:08 pm
|
Bueno, tengo un TP para la universidad de un programa de registros y archivos. Tengo varios problemas lógicos, pero el que mas me interesa es el que al terminar un procedimiento, por ejemplo Altas, directamente va a otra opcion sin ingresar nada, y recorre todos los procedimientos sin que yo se lo indique. Acá les dejo el código que tengo hasta ahora: #include <stdio.h> #include <stdlib.h> typedef struct { int legajo; char CUIL[13]; char nombre[31]; char apellido[31]; char sexo[3]; char categoria[3]; char obrasocial[51]; float sueldo; char activo[2]; } registro; /*****************************************************************************/ void CargarRegistro() { registro reg; FILE *archivo; if((archivo = fopen("empleados.dat", "a")) == NULL) { printf("No se pudo abrir el archivo\n"); return; } printf("Ingrese CUIL (Formato xx-xxxxxxxxxx): \n"); scanf("%s", reg.CUIL); printf("Ingrese Nombre: \n"); scanf("%s", reg.nombre); printf("Ingrese Apellido: \n"); scanf("%s", reg.apellido); printf("Ingrese sexo: \n"); scanf("%s", reg.sexo); printf("Ingrese categoria: \n"); scanf("%s", reg.categoria); printf("Ingrese Obra social: \n"); scanf("%s", reg.obrasocial); printf("Ingrese sueldo: \n"); scanf("%f", ®.sueldo); reg.activo[0] = '1'; fwrite(®, sizeof(registro), 1, archivo); fclose(archivo); return; } void Alta(registro datos) { int legajo = 0, encontrado = 0; FILE *archivo; printf("Ingrese un numero de legajo (0 para salir): \n"); scanf("%d", &legajo); while(legajo != 0) { if((archivo = fopen("empleados.dat", "r")) == NULL) { printf("No se pudo abrir el archivo\n"); return; } fread(&datos, sizeof(registro), 1, archivo); while((!feof(archivo)) && (encontrado == 0)) { if(datos.legajo == legajo) { encontrado = 1; fclose(archivo); } fread(&datos, sizeof(registro), 1, archivo); } if(encontrado == 1) { printf("El legajo ya existe\n"); return; } else { CargarRegistro(); } return; } } /*****************************************************************************/ void Baja(registro datos) { int legajo = 0; int confirmar = 0; FILE *archivo; printf("Ingrese un numero de legajo (0 para salir): \n"); scanf("%d", &legajo); while(legajo != 0) { if((archivo = fopen("empleados.dat", "rt")) == NULL) { printf("No se pudo abrir el archivo\n"); return; } fread(&datos, sizeof(registro), 1, archivo); while(!feof(archivo)) { if((datos.legajo == legajo) && (datos.activo[0] == '1')) { printf("Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n"); scanf("%d", &confirmar); while((confirmar != 0) && (confirmar != 1)) { printf("Opcion incorrecta. Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n"); scanf("%d", &confirmar); } switch(confirmar) { case 1: datos.activo[0] = '0'; fwrite(&datos, sizeof(registro), 1, archivo); fclose(archivo); return; case 2: return; } } fread(&datos, sizeof(registro), 1, archivo); } fclose(archivo); } } /*****************************************************************************/ int OpcionModif(registro reg, int x) { printf("Datos del empleado a modificar:\n"); printf("%d\n", reg.legajo); printf("%s\n", reg.CUIL); printf("%s\n", reg.nombre); printf("%s\n", reg.apellido); printf("%s\n", reg.sexo); printf("%s\n", reg.categoria); printf("%s\n", reg.obrasocial); printf("%f\n", reg.sueldo); printf("%s\n", reg.activo); printf("Elija que dato desea modificar\n"); printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n"); scanf("%d", &x); while( (x < 0) && (x > 5) ) { printf("Elija que dato desea modificar\n"); printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n"); scanf("%d", &x); } return x; } void Modificar(registro datos) { int legajo = 0, opc = 0; FILE *archivo; printf("Ingrese un numero de legajo (0 para salir): \n"); scanf("%d", &legajo); while(legajo != 0) { if((archivo = fopen("empleados.dat", "r")) == NULL) { printf("No se pudo abrir el archivo\n"); return; } fread(&datos, sizeof(registro), 1, archivo); while(!feof(archivo)) { if((datos.legajo == legajo) && (datos.activo[0] = '1')) { opc = OpcionModif(datos, opc); switch(opc) { case 1: printf("Ingrese el sexo:\n"); scanf("%s", datos.sexo); case 2: printf("Ingrese categoria:\n"); scanf("%s", datos.categoria); case 3: printf("Ingrese Obra Social:\n"); scanf("%s", datos.obrasocial); case 4: printf("Ingrese sueldo:\n"); scanf("%f", &datos.sueldo); } fwrite(&datos, sizeof(registro), 1, archivo); fclose(archivo); return; } fread(&datos, sizeof(registro), 1, archivo); } } printf("El legajo no existe\n"); } /*****************************************************************************/ int main() { int opcmenu = 1; registro empleados; while((opcmenu > 0) && (opcmenu < 7)) { printf("Seleccione entre una de las opciones disponibles\n"); printf("[ 1 ] - Altas\n[ 2 ] - Bajas\n[ 3 ] - Modificacion\n[ 4 ] - Listado\n[ 5 ] - Aumentar salario\n[ 6 ] - Buscar por legajo\n[ 7 ] - Salir\n"); scanf("%d", &opcmenu); switch(opcmenu) { case 1: Alta(empleados); case 2: Baja(empleados); case 3: Modificar(empleados); case 7: return -1; } } return 0; }
|
|
|
47
|
Programación / Programación C/C++ / Re: Problema con registros
|
en: 4 Septiembre 2014, 22:50 pm
|
rir, gracias como siempre. Resolví todos los errores pero no entendí lo siguiente: * En ambas funciones utilizas la notación "(*variable).campo" cuando puedes acortar evitando los paréntesis con "variable->campo". No entiendo a que te refieres con: variable->campo Y lo otro que no entendí es lo siguiente: while (feof(*db) == 0){ fgets((*clientes).apellido, 30, *db); printf("%s\n", (*clientes).nombre); /* ... */ fscanf(*db, "%d", &(*clientes).edad); printf("%d\n", (*clientes).edad); { int ch; while ((ch = fgetc(*db)) != EOF && ch != '\n') ; } }
No entiendo que hace el segundo while y cuando entraría adentro de esas llaves
|
|
|
48
|
Programación / Programación C/C++ / Problema con registros
|
en: 4 Septiembre 2014, 01:54 am
|
Hola, tengo un problema al leer un archivo en el que guardo un registro. El problema es que me muestra varios signos y numeros que yo no ingrese. Les paso a dejar las funciones en donde escribo y leo el fichero (Paso el fichero y el archivo por referencia): void DarDeAlta(registro *clientes, int n, FILE **db) { int a = 1; while (a == 1) { printf("Ingrese un nombre: "); scanf("%s", ((*clientes).nombre)); fprintf(*db, "%s\n", (*clientes).nombre); printf("Ingrese su apellido: "); scanf("%s", ((*clientes).apellido)); fprintf(*db, "%s\n", (*clientes).apellido); printf("Ingrese el telefono: "); scanf("%d", &(*clientes).telefono); fprintf(*db, "%d\n", (*clientes).telefono); printf("Ingrese la edad: "); scanf("%d", &(*clientes).edad); fprintf(*db, "%d\n", (*clientes).edad); Seguir(&a); } fclose(*db); return; } void MostrarClientes(registro *clientes, int n, FILE **db) { *db = fopen("clientes.dat", "r"); if(*db == NULL) { printf("El archivo no existe\n"); } else{ while(feof(*db) == 0) { fgets((*clientes).apellido, 30, *db); printf("%s\n", (*clientes).nombre); fgets((*clientes).apellido, 30, *db); printf("%s\n", (*clientes).apellido); fscanf(*db, "%d", &(*clientes).telefono); printf("%d\n", (*clientes).telefono); fscanf(*db, "%d", &(*clientes).edad); printf("%d\n", (*clientes).edad); } } fclose(*db); return; }
|
|
|
|
|
|
|