12 Último

Pregunta sobre "base de datos" en c

Encuesta

Votantes
1

Resultados de la encuesta

Que es mejor aprender a manejar primer en C?

  • Una libreria para ventanas como GTK+ o QT

    0%
    0 Votos
  • Una libreria para graficos como OpenGl , SDL o DirectX

    0%
    0 Votos
  • Aprender bien el manejo de memoria

    100.00%
    1 Votos
  • Aprender el tema de sockets

    0%
    0 Votos

Debes estar registrado para poder votar

      • 184
      • mensajes
      • miembro desde
      • 19/10/07
    17/12/2009
    #1 Pregunta sobre escribir y recuperar datos de archivos en c

    He creado una base de datos en c, para aprender el uso de structs, ya logre que se muestren en orden, ahora el problema es que si se agrega uno solo y se vuelve al menu, se agrega otro, se borra el primero. Y ya se soy mas desprolijo que la mierda:

    #include
    #include

    int cant_empleados = 0;
    short check;
    char opcion[2];

    struct empleado{
    char nombre[14];
    short edad;
    int sueldo;
    char apellido[16];



    };

    struct empleado empleados[50];

    int guardar()
    {
    FILE * DAT;
    DAT = fopen("c:\\DATOS.DAT","w+");
    fprintf(DAT," Nombre Apellido Edad Sueldo ");
    fprintf(DAT,"\n---------------------------------------------");
    if(cant_empleados != 0)
    {
    check = cant_empleados;
    cant_empleados = 1 ;
    do{
    fprintf(DAT,"\n %s %s %d %d",empleados[cant_empleados].nombre,empleados[cant_empleados].apellido,empleados[cant_empleados].edad,empleados[cant_empleados].sueldo);

    cant_empleados++;
    check--;
    }while(check !=0);
    }
    }
    int agregado_datos()
    {
    system("cls");
    cant_empleados++;
    printf("Ingrese el nombre:");
    scanf("%s",empleados[cant_empleados].nombre);
    printf("\nIngrese el apellido:");
    scanf("%s",empleados[cant_empleados].apellido);
    printf("\nIngrese edad:");
    scanf("%d",&empleados[cant_empleados].edad);
    printf("\nIngrese el valor del sueldo:");
    scanf("%d",&empleados[cant_empleados].sueldo);
    system("cls");

    printf("Desea agregar otro empleado?");
    printf("\n y / n :");
    scanf("%s",opcion);
    if(strcmp(opcion,"y") == 0 )
    {
    agregado_datos();
    }
    if(strcmp(opcion,"n") == 0 )
    {
    main();
    }



    }


    int main()
    {
    system("cls");
    int opt;
    printf(" Nombre Apellido Edad Sueldo ");
    printf("\n---------------------------------------------");
    if(cant_empleados != 0)
    {
    check = cant_empleados;
    cant_empleados = 1;
    do{
    printf("\n %s %s %d %d",empleados[cant_empleados].nombre,empleados[cant_empleados].apellido,empleados[cant_empleados].edad,empleados[cant_empleados].sueldo);
    cant_empleados++;
    check--;
    }while(check !=0);
    }


    printf("\n \n \n \n \n");
    printf("Presione (1), para agregar datos,\n (2) para recargar la tabla, (3) para guardar y (4) para salir.");
    printf("\n\nOpcion:");
    scanf("%d",&opt);
    if(opt==1)
    {
    agregado_datos();
    }
    if(opt==3)
    {
    guardar();
    }
    if(opt==4)
    {
    return 0;
    }


    }





    P.S = Psicofxp se me trago los espacios, alguien conoce como se llama esos servidores para subir codigo en vez de fotos?

  1. ¿Este tema te pareció interesante? Compártelo!

    ¿No es lo que buscabas? Intenta buscar un tema similar

    10 comentarios / 5829 Visitas

      • 73
      • mensajes
      • miembro desde
      • 07/06/07
    17/12/2009
    #2 Re: Pregunta sobre "base de datos" en c

    el problema es este

    DAT = fopen("c:\\DATOS.DAT","w+");

    el método que usas para abrir el archivo es write "w" el cual borra el archivo y crea uno nuevo, el método que tenés que utilizar es "a" o "a+" si tmb lo vas a leer, a = append => escribis a partir del último, te querdaría.

    DAT = fopen("c:\\DATOS.DAT","a+");

    EDIT: Eso no es base de datos, son archivos binarios (porque se utilizar variables definidas por el programador).

    EDIT2: Te dejo una referencia a fopen y los métodos para leer y escribir archivos http://www.cplusplus.com/reference/c.../cstdio/fopen/

      • 184
      • mensajes
      • miembro desde
      • 19/10/07
    17/12/2009
    #3 Re: Pregunta sobre "base de datos" en c

    El problema no es con fopen, despues voy a crear la carga de archivo, pero los datos lo ingresa el usuario, no son variables definidas previamente, despues le agrego un chequeo para ver si existe el archivo->>aca lo agregue, ademas de un cierre. Lo que quiero hacer que se dibuje correctamenta la tabla.

    #include
    #include

    int cant_empleados = 0;
    short check;
    char opcion[2];

    struct empleado{
    char nombre[14];
    short edad;
    int sueldo;
    char apellido[16];



    };

    struct empleado empleados[50];

    int guardar()
    {
    system("cls");
    FILE * DAT;
    DAT =fopen("c:\\DATOS.IDS","a");
    if(DAT == NULL)
    {
    DAT = fopen("c:\\DATOS.IDS","w+");
    }
    fprintf(DAT," Nombre Apellido Edad Sueldo ");
    fprintf(DAT,"\n---------------------------------------------");


    if(cant_empleados != 0)
    {
    check = cant_empleados;
    cant_empleados = 1 ;

    do{
    fprintf(DAT,"\n %s %s %d %d",empleados[cant_empleados].nombre,empleados[cant_empleados].apellido,empleados[cant_empleados].edad,empleados[cant_empleados].sueldo);

    cant_empleados++;
    check--;
    }while(check !=0);
    fclose(DAT);

    }
    }
    int agregado_datos()
    {
    system("cls");
    cant_empleados++;
    printf("Ingrese el nombre:");
    scanf("%s",empleados[cant_empleados].nombre);
    printf("\nIngrese el apellido:");
    scanf("%s",empleados[cant_empleados].apellido);
    printf("\nIngrese edad:");
    scanf("%d",&empleados[cant_empleados].edad);
    printf("\nIngrese el valor del sueldo:");
    scanf("%d",&empleados[cant_empleados].sueldo);
    system("cls");

    printf("Desea agregar otro empleado?");
    printf("\n y / n :");
    scanf("%s",opcion);
    if(strcmp(opcion,"y") == 0 )
    {
    agregado_datos();
    }
    if(strcmp(opcion,"n") == 0 )
    {
    main();
    }



    }


    int main()
    {
    system("cls");
    int opt;
    printf(" Nombre Apellido Edad Sueldo ");
    printf("\n---------------------------------------------");
    if(cant_empleados != 0)
    {
    check = cant_empleados;
    cant_empleados = 1;
    do{
    printf("\n");
    printf(" %s %s %d %d" ,empleados[cant_empleados].nombre,empleados[cant_empleados].apellido,empleados[cant_empleados].edad,empleados[cant_empleados].sueldo);

    cant_empleados++;
    check--;
    }while(check !=0);
    }


    printf("\n \n \n \n \n \n");
    printf("Presione (1), para agregar datos,\n (2) para recargar la tabla, (3) para guardar y (4) para salir.");
    printf("\n\nOpcion:");
    scanf("%d",&opt);
    if(opt==1)
    {
    agregado_datos();
    }
    if(opt==3)
    {
    guardar();
    }
    if(opt==4)
    {
    return 0;
    }


    }

    Despues agrego la comprobacion de Y/N en mayuscula.
    el problema que no logro solucionar, es por qué a la vuelta de de guardar(); cuando vuelve al menu "imprime" bien pero agrega un "empleado" de mas con valor 0 0 0 0.

      • 73
      • mensajes
      • miembro desde
      • 07/06/07
    17/12/2009
    #4 Re: Pregunta sobre "base de datos" en c
    Cita Escrito por someoneigna Ver mensaje
    He creado una base de datos en c, para aprender el uso de structs, ya logre que se muestren en orden, ahora el problema es que si se agrega uno solo y se vuelve al menu, se agrega otro, se borra el primero. Y ya se soy mas desprolijo que la mierda:
    ¿Estas hablando del archivo?, Si es el archivo, la solución es la que te dije para agregar datos a un archivo se lo abre en forma append, no write porque write siempre va a escribir el primer registro.

    El código es muy ilegible, cuando posteas, en las herramientas vas a ver un # que es para publicar código, usalo.

    Si vas a usar strucs (variables definidas por el programador), te conviene usar fwrite y fread para escribir y leer archivos respectivamente, fprintf se usa para archivos de texto plano.

    ejs.:

    Código:
    empleado empl;
    
    File *pf //puntero file
    
    pf = fopen("Datos.dat","a+b"); //append binary
    
    //levanto los datos de un empleado y los guardo obviamente en la variable empl
    
    fseek(pf,0L,SEEK_END); //posiciono el puntero al final
    
    fwrite(&empl,sizeof(empleado),1,pf); //escribo en el archivo
    Ahora paso el código y te muestro es sencillo
      • 184
      • mensajes
      • miembro desde
      • 19/10/07
    17/12/2009
    #5 Re: Pregunta sobre "base de datos" en c

    El problema es que debe posicionarse un nombre debajo del otro, como agregas vuelta de carro a fwrite? O se puede elegir la linea que sigue al final de fseek con algo que sirva de vuelta de carro?

      • 73
      • mensajes
      • miembro desde
      • 07/06/07
    17/12/2009
    #6 Re: Pregunta sobre "base de datos" en c

    fseek(pf,0L,SEEK_SET); //posiciona el puntero al principio del archivo
    fseek(pf,posi*sizeof(emplado),SEEK_SET); //posiciona el puntero a la posición que quieras
    fseek(pf,0L,SEEK_END); //posiciona el puntero al final

      • 184
      • mensajes
      • miembro desde
      • 19/10/07
    17/12/2009
    #7 Re: Pregunta sobre "base de datos" en c
      • 184
      • mensajes
      • miembro desde
      • 19/10/07
    17/12/2009
    #8 Re: Pregunta sobre "base de datos" en c

    Agregada comprobacion para mayuscula y cambie el color(luego lo porto a linux con ncurses). Baje el tamaño del nombre y apellido, quien tiene un apellido o nombre de 16 letras?

    Código:
    #include 
    #include 
    
    int cant_empleados = 0;
    short check;
    char opcion[2];
    short debe_crearnuevo;
    char buffer[50];
    short trash;
    
    struct empleado {
        char nombre[7];
        short edad;
        int sueldo;
        char apellido[7];
    
    
    
    };
    
    struct empleado empleados[50];
    
    int guardar()
    {
        system("cls");
        FILE * DAT;
        DAT =fopen("c:\\DATOS.IDS","a");
        if (DAT == NULL) {
            DAT = fopen("c:\\DATOS.IDS","w+");
            fprintf(DAT," Nombre  Apellido    Edad       Sueldo     ");
            fprintf(DAT,"\n---------------------------------------------");
        }
    
    
    
        if (cant_empleados != 0) {
            check = cant_empleados;
            cant_empleados = 1 ;
    
            do {
                fprintf(DAT,"\n  %s      %s        %d          %d",empleados[cant_empleados].nombre,empleados[cant_empleados].apellido,empleados[cant_empleados].edad,empleados[cant_empleados].sueldo);
    
                cant_empleados++;
                check--;
            } while (check !=0);
            fclose(DAT);
    
            printf("Se guardo correctamente, ahora volvera al menu...");
            system("pause");
        }
    }
    
    int cargar()
    {
        system("cls");
        FILE *RECARGA;
        RECARGA = fopen("C:\\DATOS.IDS","r");
        if (RECARGA = NULL) {
            printf("No se encontraron datos, proceda a crear uno nuevo\n");
            debe_crearnuevo = 1;
            system("pause");
            agregado_datos();
        } else {
    
            check = cant_empleados;
            cant_empleados = 1 ;
            do {
    
                cant_empleados++;
                check--;
            } while (check !=0);
    
    
    
            printf("Carga sactifactoria, retornando al menu...\n");
            system("pause"); /*Usado hasta que se termine de pulir el codigo,luego scanf*/
            fclose(RECARGA);
            main();
        }
    }
    
    int agregado_datos()
    {
        system("cls");
        cant_empleados++;
        printf("Ingrese el nombre: ");
        scanf("%s",empleados[cant_empleados].nombre);
        printf("\nIngrese el apellido: ");
        scanf("%s",empleados[cant_empleados].apellido);
        printf("\nIngrese edad: ");
        scanf("%d",&empleados[cant_empleados].edad);
        printf("\nIngrese el valor del sueldo: ");
        scanf("%d",&empleados[cant_empleados].sueldo);
        system("cls");
        for (;;) {
            printf("Desea agregar otro empleado?");
            printf("\n y / n : ");
            scanf("%s",opcion);
            if (strcmp(opcion,"y")  == 0 ) {
                agregado_datos();
            }
            if (strcmp(opcion,"n")  == 0 ) {
                main();
            }
            if (strcmp(opcion,"Y") == 0 ) {
                agregado_datos();
            }
            if (strcmp(opcion,"N") == 0 ) {
                main();
            }
            system("cls");
        }
    
    
    
    
    }
    
    
    int main()
    {
    
        system("color 0a");
        system("cls");
        int opt;
    
        printf(" Nombre  Apellido    Edad       Sueldo     ");
        printf("\n---------------------------------------------");
        if (cant_empleados != 0) {
            check = cant_empleados;
            cant_empleados = 1;
            do {
                printf("\n");
                printf(" %s         %s          %d          %d" ,empleados[cant_empleados].nombre,empleados[cant_empleados].apellido,empleados[cant_empleados].edad,empleados[cant_empleados].sueldo);
    
                cant_empleados++;
                check--;
            } while (check !=0);
            fflush(stdin);
        }
    
    
        printf("\n \n \n \n \n \n");
        printf("Presione (1), para agregar datos, (2) para recargar la tabla,");
        printf("\n(3) para guardar y (4) para salir.");
        printf("\n\nOpcion: ");
        scanf("%d",&opt);
        if (opt==1) {
            agregado_datos();
        }
        if (opt==2) {
            cargar();
        }
        if (opt==3) {
            guardar();
        }
        if (opt==4) {
            return 0;
        }
    
    
    }
    No me decido si guardar el archivo como binario, o como texto, sino hago que se pueda elegir y listo.Ahora lo hago con binario y hago que sea posible elegir destino.
      • 73
      • mensajes
      • miembro desde
      • 07/06/07
    17/12/2009
    #9 Re: Pregunta sobre "base de datos" en c

    en primera instancia hay miles de errores conecptuales, tenes funciones int que no devuelven nada, muchas variables globales innecesarias, mezclas funciones que se usan para archivos binarios con de texto te voy a dejar unas correciones

    1. Función Guardar

    Código:
    void guardar(){
        FILE *pf;
        pf = fopen("c:\\Datos.dat","ab");
        int n;
        for(n=0;n 
    eso debería ser tu función guardar, no esta probada pero debe funcionar.

    2. Mostrar Empleados (lo que haces en el main)

    Código:
        int n;
        for(n=0;n 
    no se entiende en tu codigo porque usas un if y un do, una variable auxiliar check.

    3. Menú

    Código:
        do{
            printf("\n \n \n \n \n \n");
            printf("Presione (1), para agregar datos, (2) para recargar la tabla,");
            printf("\n(3) para guardar y (4) para salir.");
            printf("\n\nOpcion: ");
            scanf("%d",&opt);
            switch(opt){
                case 1:
                    agregado_datos();
                    break;
                case 2:
                    cargar();
                    break;
                case 3:
                    guardar();
            }
        }while(opt!=4);
    primero se pone el menú en un loop, no se lo llama desde otras funciones normalmente, otra cosa para analizar las opciones de una variable no pones 4 if se pone un switch.

    última la función strcmpi no difiere entre mayusculas y minusculas no hace falta la validación.
      • 184
      • mensajes
      • miembro desde
      • 19/10/07
    17/12/2009
    #10 Re: Pregunta sobre "base de datos" en c

    Si el chequeo a la mayuscula por el loop, te vuelve al scanf, si diferencia . Como leo los datos en binario y los vuelvo a imprimir? Intente con fread y no lo logre.
    -----Agregado el 17/12/2009 a las 09 : 32 : 45-----
    aca esta lo de las mayusculas:

    #include
    #include

    int main()
    {
    char opcion[6];
    printf("Usted esta vivo?: ");
    scanf("%s",opcion);

    if(strcmp(opcion,"si") == 0)
    {
    printf("\nsi en minuscula vale 1\n");
    system("pause");
    }
    if(strcmp(opcion,"SI") == 0)
    {
    printf("\nSI EN MAYUSCULA VALE 3\n");
    system("pause");

    }
    if(strcmp(opcion,"NO") == 0)
    {
    printf("\nNO EN MAYUSCULA VALE 4\n");
    system("pause");
    }
    if(strcmp(opcion,"no") == 0)
    {
    printf("\n no en minuscula vale 2\n");
    system("pause");
    }

    return 0;
    }

12 Último