Autor
|
Tema: Problema - Registros y archivos (Leído 3,213 veces)
|
jaxoR
Desconectado
Mensajes: 93
?
|
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; }
|
|
|
En línea
|
|
|
|
fary
|
Aquí: switch(opcmenu) { case 1: Alta(empleados); case 2: Baja(empleados); case 3: Modificar(empleados); case 7: return -1; }
Te faltan los break... switch(opcmenu) { case 1: Alta(empleados); break; case 2: Baja(empleados); break; case 3: Modificar(empleados); break; case 7: return -1; break; }
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
generalizando lo dicho por mDrinky... cada "case" de un "switch" necesita un "break" para que el código salga del "switch", si no pones dicho "break", se ejecuta el código del siguiente "case".
Te lo comento porque he visto que no has puesto un solo "break" en tu código... y tienes varios "switch"
|
|
|
En línea
|
|
|
|
jaxoR
Desconectado
Mensajes: 93
?
|
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
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Si cada vez que entras en, por ejemplo "Altas", haces "fopen", deberías hacer también "fclose". Básicamente porque si no el fichero se queda abierto y te puede dar problemas si intentas abrirlo de nuevo (desde imposibilidad para poder abrirlo hasta almacenar en el fichero información aleatoria)
|
|
|
En línea
|
|
|
|
jaxoR
Desconectado
Mensajes: 93
?
|
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; }
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
if(encontrado == 1) { printf("El legajo ya existe\n"); return; } else { fclose(archivo); CargarRegistro(); }
Si encuentra el legajo... ¿dónde es exactamente cuando se cierra el fichero abierto? Y tienes otras fugas por ahí: switch(confirmar) { case 1: datos.activo[0] = '0'; fwrite(&datos, sizeof(registro), 1, archivo); fclose(archivo); return; break; case 2: return; break; // <<<<------ AQUI!!!! }
Además, no entiendo este código: 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) // <<<< ----- ESTO!!! { } }
Si "legajo" no va a cambiar de valor... por qué no pones un simple "if"?? No se, deberías revisar un poco más a fondo tu código.
|
|
« Última modificación: 6 Noviembre 2014, 13:36 pm por eferion »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Archivos, Registros en c/c++
Programación C/C++
|
programador10
|
3
|
6,257
|
14 Junio 2011, 16:11 pm
por programador10
|
|
|
Pequeño inconveniente archivos/registros
Programación C/C++
|
reeyesg
|
3
|
2,036
|
24 Enero 2014, 17:12 pm
por reeyesg
|
|
|
Pedido o ayuda ARCHIVOS/REGISTROS
Programación C/C++
|
reeyesg
|
1
|
1,855
|
10 Febrero 2014, 18:40 pm
por ivancea96
|
|
|
ayuda con registros y archivos .txt en C++
Programación C/C++
|
chiripita
|
3
|
3,853
|
4 Agosto 2014, 10:25 am
por eferion
|
|
|
archivos y registros
Programación C/C++
|
kjg
|
1
|
1,733
|
13 Diciembre 2016, 21:12 pm
por engel lex
|
|