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 Votos -
Una libreria para graficos como OpenGl , SDL o DirectX
0 Votos -
Aprender bien el manejo de memoria
1 Votos -
Aprender el tema de sockets
0 Votos
Debes estar registrado para poder votar
-
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? -
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/ -
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. -
¿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.:Ahora paso el código y te muestro es sencilloCó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 -
Aca esta la falla que digo:
http://www.subirimagenes.com/otros-lafalla-3734013.html -
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?
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.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; } } -
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 Guardareso debería ser tu función guardar, no esta probada pero debe funcionar.Código:void guardar(){ FILE *pf; pf = fopen("c:\\Datos.dat","ab"); int n; for(n=0;n
2. Mostrar Empleados (lo que haces en el main)no se entiende en tu codigo porque usas un if y un do, una variable auxiliar check.Código:int n; for(n=0;n
3. Menú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.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);
última la función strcmpi no difiere entre mayusculas y minusculas no hace falta la validación. -
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;
}
