elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema - Registros y archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema - Registros y archivos  (Leído 3,164 veces)
jaxoR

Desconectado Desconectado

Mensajes: 93

?


Ver Perfil WWW
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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct
  5. {
  6.    int legajo;
  7.    char CUIL[13];
  8.    char nombre[31];
  9.    char apellido[31];
  10.    char sexo[3];
  11.    char categoria[3];
  12.    char obrasocial[51];
  13.    float sueldo;
  14.    char activo[2];
  15. } registro;
  16.  
  17. /*****************************************************************************/
  18.  
  19. void CargarRegistro()
  20. {
  21.    registro reg;
  22.    FILE *archivo;
  23.  
  24.    if((archivo = fopen("empleados.dat", "a")) == NULL)
  25. {
  26. printf("No se pudo abrir el archivo\n");
  27. return;
  28. }
  29.  
  30.    printf("Ingrese CUIL (Formato xx-xxxxxxxxxx): \n");
  31.    scanf("%s", reg.CUIL);
  32.    printf("Ingrese Nombre: \n");
  33.    scanf("%s", reg.nombre);
  34.    printf("Ingrese Apellido: \n");
  35.    scanf("%s", reg.apellido);
  36.    printf("Ingrese sexo: \n");
  37.    scanf("%s", reg.sexo);
  38.    printf("Ingrese categoria: \n");
  39.    scanf("%s", reg.categoria);
  40.    printf("Ingrese Obra social: \n");
  41.    scanf("%s", reg.obrasocial);
  42.    printf("Ingrese sueldo: \n");
  43.    scanf("%f", &reg.sueldo);
  44.    reg.activo[0] = '1';
  45.  
  46.    fwrite(&reg, sizeof(registro), 1, archivo);
  47.  
  48.    fclose(archivo);
  49.  
  50.    return;
  51. }
  52.  
  53. void Alta(registro datos)
  54. {
  55.    int legajo = 0, encontrado = 0;
  56.    FILE *archivo;
  57.  
  58.    printf("Ingrese un numero de legajo (0 para salir): \n");
  59.    scanf("%d", &legajo);
  60.  
  61.    while(legajo != 0)
  62.    {
  63.        if((archivo = fopen("empleados.dat", "r")) == NULL)
  64.        {
  65.            printf("No se pudo abrir el archivo\n");
  66.            return;
  67.        }
  68.  
  69.        fread(&datos, sizeof(registro), 1, archivo);
  70.        while((!feof(archivo)) && (encontrado == 0))
  71.        {
  72.            if(datos.legajo == legajo)
  73.            {
  74.                encontrado = 1;
  75.                fclose(archivo);
  76.            }
  77.  
  78.            fread(&datos, sizeof(registro), 1, archivo);
  79.        }
  80.  
  81.        if(encontrado == 1)
  82.        {
  83.            printf("El legajo ya existe\n");
  84.            return;
  85.        }
  86.        else
  87.        {
  88.            CargarRegistro();
  89.        }
  90.  
  91.        return;
  92.    }
  93. }
  94.  
  95. /*****************************************************************************/
  96.  
  97. void Baja(registro datos)
  98. {
  99.    int legajo = 0;
  100.    int confirmar = 0;
  101.    FILE *archivo;
  102.  
  103.    printf("Ingrese un numero de legajo (0 para salir): \n");
  104.    scanf("%d", &legajo);
  105.  
  106.    while(legajo != 0)
  107.    {
  108.        if((archivo = fopen("empleados.dat", "rt")) == NULL)
  109.        {
  110.            printf("No se pudo abrir el archivo\n");
  111.            return;
  112.        }
  113.  
  114.        fread(&datos, sizeof(registro), 1, archivo);
  115.        while(!feof(archivo))
  116.        {
  117.            if((datos.legajo == legajo) && (datos.activo[0] == '1'))
  118.            {
  119.                printf("Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n");
  120.                scanf("%d", &confirmar);
  121.                while((confirmar != 0) && (confirmar != 1))
  122.                {
  123.                    printf("Opcion incorrecta. Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n");
  124.                    scanf("%d", &confirmar);
  125.                }
  126.  
  127.                switch(confirmar)
  128.                {
  129.                    case 1:
  130.                        datos.activo[0] = '0';
  131.                        fwrite(&datos, sizeof(registro), 1, archivo);
  132.                        fclose(archivo);
  133.                        return;
  134.  
  135.                    case 2: return;
  136.                }
  137.  
  138.            }
  139.  
  140.            fread(&datos, sizeof(registro), 1, archivo);
  141.        }
  142.  
  143.        fclose(archivo);
  144.  
  145.    }
  146. }
  147.  
  148. /*****************************************************************************/
  149.  
  150. int OpcionModif(registro reg, int x)
  151. {
  152.    printf("Datos del empleado a modificar:\n");
  153.    printf("%d\n", reg.legajo);
  154.    printf("%s\n", reg.CUIL);
  155.    printf("%s\n", reg.nombre);
  156.    printf("%s\n", reg.apellido);
  157.    printf("%s\n", reg.sexo);
  158.    printf("%s\n", reg.categoria);
  159.    printf("%s\n", reg.obrasocial);
  160.    printf("%f\n", reg.sueldo);
  161.    printf("%s\n", reg.activo);
  162.  
  163.    printf("Elija que dato desea modificar\n");
  164.    printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n");
  165.    scanf("%d", &x);
  166.  
  167.    while( (x < 0) && (x > 5) )
  168.    {
  169.        printf("Elija que dato desea modificar\n");
  170.        printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n");
  171.        scanf("%d", &x);
  172.    }
  173.  
  174.    return x;
  175. }
  176.  
  177. void Modificar(registro datos)
  178. {
  179.    int legajo = 0, opc = 0;
  180.    FILE *archivo;
  181.  
  182.    printf("Ingrese un numero de legajo (0 para salir): \n");
  183.    scanf("%d", &legajo);
  184.  
  185.    while(legajo != 0)
  186.    {
  187.        if((archivo = fopen("empleados.dat", "r")) == NULL)
  188.        {
  189.            printf("No se pudo abrir el archivo\n");
  190.            return;
  191.        }
  192.  
  193.        fread(&datos, sizeof(registro), 1, archivo);
  194.  
  195.        while(!feof(archivo))
  196.        {
  197.            if((datos.legajo == legajo) && (datos.activo[0] = '1'))
  198.            {
  199.                opc = OpcionModif(datos, opc);
  200.  
  201.                switch(opc)
  202.                {
  203.                    case 1:
  204.                        printf("Ingrese el sexo:\n");
  205.                        scanf("%s", datos.sexo);
  206.                    case 2:
  207.                        printf("Ingrese categoria:\n");
  208.                        scanf("%s", datos.categoria);
  209.                    case 3:
  210.                        printf("Ingrese Obra Social:\n");
  211.                        scanf("%s", datos.obrasocial);
  212.                    case 4:
  213.                        printf("Ingrese sueldo:\n");
  214.                        scanf("%f", &datos.sueldo);
  215.                }
  216.  
  217.                fwrite(&datos, sizeof(registro), 1, archivo);
  218.                fclose(archivo);
  219.                return;
  220.  
  221.            }
  222.            fread(&datos, sizeof(registro), 1, archivo);
  223.        }
  224.  
  225.  
  226.    }
  227.    printf("El legajo no existe\n");
  228. }
  229.  
  230. /*****************************************************************************/
  231.  
  232. int main()
  233. {
  234.    int opcmenu = 1;
  235.    registro empleados;
  236.  
  237.    while((opcmenu > 0) && (opcmenu < 7))
  238.    {
  239.        printf("Seleccione entre una de las opciones disponibles\n");
  240.        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");
  241.        scanf("%d", &opcmenu);
  242.  
  243.        switch(opcmenu)
  244.        {
  245.            case 1: Alta(empleados);
  246.            case 2: Baja(empleados);
  247.            case 3: Modificar(empleados);
  248.            case 7: return -1;
  249.  
  250.        }
  251.    }
  252.  
  253.    return 0;
  254. }


En línea

fary


Desconectado Desconectado

Mensajes: 1.076



Ver Perfil WWW
Re: Problema - Registros y archivos
« Respuesta #1 en: 6 Noviembre 2014, 10:03 am »

Aquí:

Código
  1. switch(opcmenu)
  2.       {
  3.           case 1: Alta(empleados);
  4.           case 2: Baja(empleados);
  5.           case 3: Modificar(empleados);
  6.           case 7: return -1;
  7.  
  8.       }

Te faltan los break...

Código
  1. switch(opcmenu)
  2.       {
  3.           case 1: Alta(empleados); break;
  4.           case 2: Baja(empleados); break;
  5.           case 3: Modificar(empleados); break;
  6.           case 7: return -1; break;
  7.  
  8.       }


En línea

Un byte a la izquierda.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema - Registros y archivos
« Respuesta #2 en: 6 Noviembre 2014, 10:32 am »

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 Desconectado

Mensajes: 93

?


Ver Perfil WWW
Re: Problema - Registros y archivos
« Respuesta #3 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
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema - Registros y archivos
« Respuesta #4 en: 6 Noviembre 2014, 13:00 pm »

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 Desconectado

Mensajes: 93

?


Ver Perfil WWW
Re: Problema - Registros y archivos
« Respuesta #5 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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct
  5. {
  6.    int legajo;
  7.    char CUIL[13];
  8.    char nombre[31];
  9.    char apellido[31];
  10.    char sexo[3];
  11.    char categoria[3];
  12.    char obrasocial[51];
  13.    float sueldo;
  14.    char activo[2];
  15. } registro;
  16.  
  17. /*****************************************************************************/
  18.  
  19. void CargarRegistro()
  20. {
  21. registro reg;
  22.    FILE *archivo;
  23.  
  24. archivo = fopen("empleados.dat", "a");
  25.    if(archivo == NULL)
  26. {
  27. printf("No se pudo abrir el archivo\n");
  28. return;
  29. }
  30.  
  31.    printf("Ingrese CUIL (Formato xx-xxxxxxxxxx): \n");
  32.    scanf("%s", reg.CUIL);
  33.    printf("Ingrese Nombre: \n");
  34.    scanf("%s", reg.nombre);
  35.    printf("Ingrese Apellido: \n");
  36.    scanf("%s", reg.apellido);
  37.    printf("Ingrese sexo: \n");
  38.    scanf("%s", reg.sexo);
  39.    printf("Ingrese categoria: \n");
  40.    scanf("%s", reg.categoria);
  41.    printf("Ingrese Obra social: \n");
  42.    scanf("%s", reg.obrasocial);
  43.    printf("Ingrese sueldo: \n");
  44.    scanf("%f", &reg.sueldo);
  45.    reg.activo[0] = '1';
  46.  
  47.    fwrite(&reg, sizeof(registro), 1, archivo);
  48.  
  49.    fclose(archivo);
  50.  
  51.    return;
  52. }
  53.  
  54. void Alta(registro datos)
  55. {
  56.    int legajo = 0, encontrado = 0;
  57.    FILE *archivo;
  58.  
  59.    printf("Ingrese un numero de legajo (0 para salir): \n");
  60.    scanf("%d", &legajo);
  61.  
  62.    while(legajo != 0)
  63.    {
  64.     archivo = fopen("empleados.dat", "r");
  65.        if(archivo == NULL)
  66.        {
  67.            printf("No se pudo abrir el archivo\n");
  68.            return;
  69.        }
  70.  
  71.        fread(&datos, sizeof(registro), 1, archivo);
  72.        while((!feof(archivo)) && (encontrado == 0))
  73.        {
  74.            if(datos.legajo == legajo)
  75.            {
  76.                encontrado = 1;
  77.                fclose(archivo);
  78.            }
  79.  
  80.            fread(&datos, sizeof(registro), 1, archivo);
  81.        }
  82.  
  83.        if(encontrado == 1)
  84.        {
  85.            printf("El legajo ya existe\n");
  86.            return;
  87.        }
  88.        else
  89.        {
  90.         fclose(archivo);
  91.            CargarRegistro();
  92.        }
  93.  
  94.        return;
  95.    }
  96. }
  97.  
  98. /*****************************************************************************/
  99.  
  100. void Baja(registro datos)
  101. {
  102.    int legajo = 0;
  103.    int confirmar = 0;
  104.    FILE *archivo;
  105.  
  106.    printf("Ingrese un numero de legajo (0 para salir): \n");
  107.    scanf("%d", &legajo);
  108.  
  109.    while(legajo != 0)
  110.    {
  111.     archivo = fopen("empleados.dat", "r+");
  112.        if(archivo == NULL)
  113.        {
  114.            printf("No se pudo abrir el archivo\n");
  115.            return;
  116.        }
  117.  
  118.        fread(&datos, sizeof(registro), 1, archivo);
  119.        while(!feof(archivo))
  120.        {
  121.            if((datos.legajo == legajo) && (datos.activo[0] == '1'))
  122.            {
  123.                printf("Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n");
  124.                scanf("%d", &confirmar);
  125.  
  126.                while((confirmar != 0) && (confirmar != 1))
  127.                {
  128.                    printf("Opcion incorrecta. Esta seguro que desea dar de baja el registro?\n[ 1 ] - Si\n[ 2 ] - No\n");
  129.                    scanf("%d", &confirmar);
  130.                }
  131.  
  132.                switch(confirmar)
  133.                {
  134.                    case 1:
  135.                        datos.activo[0] = '0';
  136.                        fwrite(&datos, sizeof(registro), 1, archivo);
  137.                        fclose(archivo);
  138.                        return;
  139.                        break;
  140.  
  141.                    case 2: return; break;
  142.                }
  143.  
  144.            }
  145.  
  146.            fread(&datos, sizeof(registro), 1, archivo);
  147.        }
  148.  
  149.        fclose(archivo);
  150.  
  151.    }
  152. }
  153.  
  154. /*****************************************************************************/
  155.  
  156. int OpcionModif(registro reg, int x)
  157. {
  158.    printf("Datos del empleado a modificar:\n");
  159.    printf("%d\n", reg.legajo);
  160.    printf("%s\n", reg.CUIL);
  161.    printf("%s\n", reg.nombre);
  162.    printf("%s\n", reg.apellido);
  163.    printf("%s\n", reg.sexo);
  164.    printf("%s\n", reg.categoria);
  165.    printf("%s\n", reg.obrasocial);
  166.    printf("%f\n", reg.sueldo);
  167.    printf("%s\n", reg.activo);
  168.  
  169.    printf("Elija que dato desea modificar\n");
  170.    printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n");
  171.    scanf("%d", &x);
  172.  
  173.    while( (x < 0) && (x > 5) )
  174.    {
  175.        printf("Elija que dato desea modificar\n");
  176.        printf("[ 1 ] - Sexo\n[ 2 ] - Categoria\n[ 3 ] - Obra social\n[ 4 ] - Sueldo\nIngrese cualquier otro numero para salir\n");
  177.        scanf("%d", &x);
  178.    }
  179.  
  180.    return x;
  181. }
  182.  
  183. void Modificar(registro datos)
  184. {
  185.    int legajo = 0, opc = 0;
  186.    FILE *archivo;
  187.  
  188.    printf("Ingrese un numero de legajo (0 para salir): \n");
  189.    scanf("%d", &legajo);
  190.  
  191.    while(legajo != 0)
  192.    {
  193.     archivo = fopen("empleados.dat", "r+");
  194.        if(archivo == NULL)
  195.        {
  196.            printf("No se pudo abrir el archivo\n");
  197.            return;
  198.        }
  199.  
  200.        fread(&datos, sizeof(registro), 1, archivo);
  201.  
  202.        while(!feof(archivo))
  203.        {
  204.            if((datos.legajo == legajo) && (datos.activo[0] = '1'))
  205.            {
  206.                opc = OpcionModif(datos, opc);
  207.  
  208.                switch(opc)
  209.                {
  210.                    case 1:
  211.                        printf("Ingrese el sexo:\n");
  212.                        scanf("%s", datos.sexo);
  213.                        break;
  214.                    case 2:
  215.                        printf("Ingrese categoria:\n");
  216.                        scanf("%s", datos.categoria);
  217.                        break;
  218.                    case 3:
  219.                        printf("Ingrese Obra Social:\n");
  220.                        scanf("%s", datos.obrasocial);
  221.                        break;
  222.                    case 4:
  223.                        printf("Ingrese sueldo:\n");
  224.                        scanf("%f", &datos.sueldo);
  225.                        break;
  226.                }
  227.  
  228.                fwrite(&datos, sizeof(registro), 1, archivo);
  229.                fclose(archivo);
  230.                return;
  231.  
  232.            }
  233.            fread(&datos, sizeof(registro), 1, archivo);
  234.        }
  235.  
  236.  
  237.    }
  238.    printf("El legajo no existe\n");
  239.    fclose(archivo);
  240. }
  241.  
  242. /*****************************************************************************/
  243.  
  244. int main()
  245. {
  246.    int opcmenu = 1;
  247.    registro empleados;
  248.    FILE *archivo;
  249.  
  250.    while((opcmenu > 0) && (opcmenu < 7))
  251.    {
  252.        printf("Seleccione entre una de las opciones disponibles\n");
  253.        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");
  254.        scanf("%d", &opcmenu);
  255.  
  256.        switch(opcmenu)
  257.        {
  258.            case 1: Alta(empleados); break;
  259.            case 2: Baja(empleados); break;
  260.            case 3: Modificar(empleados); break;
  261.            case 7: return -1; break;
  262.  
  263.        }
  264.    }
  265.  
  266.    return 0;
  267. }
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema - Registros y archivos
« Respuesta #6 en: 6 Noviembre 2014, 13:33 pm »

Código
  1.        if(encontrado == 1)
  2.        {
  3.            printf("El legajo ya existe\n");
  4.            return;
  5.        }
  6.        else
  7.        {
  8.         fclose(archivo);
  9.            CargarRegistro();
  10.        }
  11.  

Si encuentra el legajo... ¿dónde es exactamente cuando se cierra el fichero abierto?

Y tienes otras fugas por ahí:

Código
  1.                switch(confirmar)
  2.                {
  3.                    case 1:
  4.                        datos.activo[0] = '0';
  5.                        fwrite(&datos, sizeof(registro), 1, archivo);
  6.                        fclose(archivo);
  7.                        return;
  8.                        break;
  9.  
  10.                    case 2: return; break; // <<<<------ AQUI!!!!
  11.                }

Además, no entiendo este código:

Código
  1. void Baja(registro datos)
  2. {
  3.    int legajo = 0;
  4.    int confirmar = 0;
  5.    FILE *archivo;
  6.  
  7.    printf("Ingrese un numero de legajo (0 para salir): \n");
  8.    scanf("%d", &legajo);
  9.  
  10.    while(legajo != 0) // <<<< ----- ESTO!!!
  11.    {
  12.    }
  13. }

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Archivos, Registros en c/c++
Programación C/C++
programador10 3 6,214 Último mensaje 14 Junio 2011, 16:11 pm
por programador10
Pequeño inconveniente archivos/registros
Programación C/C++
reeyesg 3 2,004 Último mensaje 24 Enero 2014, 17:12 pm
por reeyesg
Pedido o ayuda ARCHIVOS/REGISTROS
Programación C/C++
reeyesg 1 1,817 Último mensaje 10 Febrero 2014, 18:40 pm
por ivancea96
ayuda con registros y archivos .txt en C++
Programación C/C++
chiripita 3 3,819 Último mensaje 4 Agosto 2014, 10:25 am
por eferion
archivos y registros
Programación C/C++
kjg 1 1,695 Último mensaje 13 Diciembre 2016, 21:12 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines