Primero que nada hola, bien, tengo el siguiente programa el cual tiene un modulo de agregar un registro solamente si la clave no existe en el archivo de registros tengo lo siguiente:
#include <stdio.h>
//EL PROBLEMA ESTA EN EL MODULO "void cargar_docentes(archivo docentes)"
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef char tcad[50];
typedef struct tfecha{
int dia;
int mes;
int anyo;
};
typedef struct tformacion{
tcad titulo;
tcad facultad;
tcad universidad;
};
typedef struct tdocente{
int legajo;
tcad nombre_apellido;
tfecha fecha_nac;
tformacion educacion;
int DNI;
tcad cargo;
};
typedef FILE *parchivo;
void cargar(tdocente &docente);
void mostrar(tdocente docente);
void cargar_docentes(parchivo docentes);
bool consulta(parchivo docentes, int codigo);
void mostrar_docentes(parchivo docentes);
void busqueda(parchivo docentes, int codigo);
void modificar_docente(parchivo docentes, int codigo);
void eliminar_docente(parchivo docentes, int codigo);
void listar_docentes_especificos(parchivo docentes, tcad buscado);
void nueva_cadena(tcad &cadena);
int main()
{
parchivo docentes;
int opcion, codigo;
tcad buscado;
do{
system("cls");
cout<<"1. Cargar docente"<<endl;
cout<<"2. Consultar docente"<<endl;
cout<<"3. Listar docentes"<<endl;
cout<<"4. Buscar docente"<<endl;
cout<<"5. Modificar docente"<<endl;
cout<<"6. Eliminar docente"<<endl;
cout<<"7. Listar docentes por universidad"<<endl;
cout<<"8. Salir"<<endl;
cin>>opcion;
switch(opcion){
case 1: cargar_docentes(docentes);break;
case 2: cout<<"Ingrese numero de legajo: ";
cin>>codigo;
if(consulta(docentes,codigo)==true)
cout<<"Docente encontrado"<<endl;
else
cout<<"Docente no encontrado"<<endl;
break;
case 3: mostrar_docentes(docentes);break;
case 4: cout<<"Ingrese numero de legajo: ";
cin>>codigo;
busqueda(docentes,codigo);break;
case 5: cout<<"Ingrese numero de legajo: ";
cin>>codigo;
modificar_docente(docentes,codigo);break;
case 6: cout<<"Ingrese numero de legajo: ";
cin>>codigo;
eliminar_docente(docentes,codigo);break;
case 7: cout<<"Ingrese universidad: ";
nueva_cadena(buscado);
listar_docentes_especificos(docentes,buscado);break;
case 8: cout<<"FIN DEL PROGRAMA"<<endl;break;
default: cout<<"Opcion incorrecta"<<endl;
}
system("pause");
}while(opcion!=8);
}
void cargar(tdocente &docente)
{
cout<<"Ingrese datos del docente"<<endl;
cout<<"Legajo: ";
cin>>docente.legajo;
cout<<"Nombre y apellido: ";
nueva_cadena(docente.nombre_apellido);
cout<<"Fecha de nadimiento DD/MM/AA"<<endl;
cin>>docente.fecha_nac.dia;
cin>>docente.fecha_nac.mes;
cin>>docente.fecha_nac.anyo;
cout<<"Formacion academica"<<endl;
cout<<"Titulo: ";
nueva_cadena(docente.educacion.titulo);
cout<<"Facultad: ";
nueva_cadena(docente.educacion.facultad);
cout<<"Universidad: ";
nueva_cadena(docente.educacion.universidad);
cout<<"DNI: ";
cin>>docente.DNI;
cout<<"Cargo: ";
nueva_cadena(docente.cargo);
}
void mostrar(tdocente docente)
{
cout<<"Datos del docente"<<endl;
cout<<"Legajo: "<<docente.legajo<<endl;
cout<<"Nombre y apellido: "<<docente.nombre_apellido<<endl;
cout<<"Fecha de nadimiento:"<<docente.fecha_nac.dia<<"/"<<docente.fecha_nac.mes<<"/"<<docente.fecha_nac.anyo<<endl;
cout<<"Formacion academica"<<endl;
cout<<"Titulo: "<<docente.educacion.titulo<<endl;
cout<<"Facultad: "<<docente.educacion.facultad<<endl;
cout<<"Universidad: "<<docente.educacion.universidad<<endl;
cout<<"DNI: "<<docente.DNI<<endl;
cout<<"Cargo: "<<docente.cargo<<endl<<endl;
}
//EL PROBLEMA ES ESTE MODULO
void cargar_docentes(parchivo docentes)
{
tdocente d;
docentes=fopen("docentes.txt","ab+");
cargar(d);
fclose(docentes);
if(consulta(docentes,d.legajo)==false){
docentes=fopen("docentes.txt","ab");
fwrite(&d,sizeof(d),1,docentes);
}
else
cout<<"El numero de legajo ya existe"<<endl;
fclose(docentes);
}
bool consulta(parchivo docentes, int codigo)
{
tdocente d;
bool encontrado=false;
docentes=fopen("docentes.txt","rb");
if(docentes!=NULL){
while(!feof(docentes) && !encontrado){
fread(&d,sizeof(d),1,docentes);
if(d.legajo==codigo)
encontrado=true;
}
}
fclose(docentes);
return encontrado;
}
void mostrar_docentes(parchivo docentes)
{
tdocente d;
docentes=fopen("docentes.txt","rb");
if(docentes==NULL)
cout<<"No se pudo abrir el archivo"<<endl;
else{
while(!feof(docentes)){
fread(&d,sizeof(d),1,docentes);
if(!feof(docentes))
mostrar(d);
}
}
fclose(docentes);
}
void busqueda(parchivo docentes, int codigo)
{
tdocente d;
bool encontrado=false;
docentes=fopen("docentes.txt","rb");
if(docentes==NULL)
cout<<"No se pudo abrir el archivo"<<endl;
else{
while(!feof(docentes) && !encontrado){
fread(&d,sizeof(d),1,docentes);
if(d.legajo==codigo){
mostrar(d);
encontrado=true;
}
}
if(encontrado==false)
cout<<"Docente no encontrado"<<endl;
}
fclose(docentes);
}
void modificar_docente(parchivo docentes, int codigo)
{
tdocente d;
bool encontrado=false;
docentes=fopen("docentes.txt","rb+");
if(docentes==NULL)
cout<<"No se pudo abrir el archivo"<<endl;
else{
while(!feof(docentes) && !encontrado){
fread(&d,sizeof(d),1,docentes);
if(codigo==d.legajo)
encontrado=true;
}
if(encontrado==true){
cargar(d);
fseek(docentes,-sizeof(d),1);
fwrite(&d,sizeof(d),1,docentes);
}
else
cout<<"Docente no encontrado"<<endl;
}
fclose(docentes);
}
void eliminar_docente(parchivo docentes, int codigo)
{
tdocente d;
parchivo temporal;
docentes=fopen("docentes.txt","rb");
temporal=fopen("temporal.txt","wb");
if(docentes==NULL){
cout<<"ARCHIVO INEXISTENTE"<<endl;
fclose(docentes);
fclose(temporal);
}
else{
while(!feof(docentes)){
fread(&d,sizeof(d),1,docentes);
if(!feof(docentes) && d.legajo!=codigo)
fwrite(&d,sizeof(d),1,temporal);
}
fclose(docentes);
fclose(temporal);
if(remove("docentes.txt")==0)
rename("temporal.txt","docentes.txt");
else
cout<<"ERROR AL ELIMINAR"<<endl;
}
}
void listar_docentes_especificos(parchivo docentes, tcad buscado)
{
tdocente d;
docentes=fopen("docentes.txt","rb");
if(docentes==NULL)
cout<<"No se pudo abrir el archivo"<<endl;
else{
while(!feof(docentes)){
fread(&d,sizeof(d),1,docentes);
if(!feof(docentes) && strcmp(d.educacion.universidad,buscado)==0)
mostrar(d);
}
}
fclose(docentes);
}
void nueva_cadena(tcad &cadena)
{
fflush(stdin);
gets(cadena);
fflush(stdin);
}
Si bien no me resulta funcional lo que me enseñaron de cerrar el archivo para llamar a la funcion de busqueda que devuelve un valor logico.
Como en este caso:
void agregar_alumnos(parchivo alumnos)
{
talumno a;
int cantidad;
alumnos=fopen("alumnos.txt","wb");
cout<<"Cuántos registros desea guardar: ";
cin>>cantidad;
while(cantidad>0){
carga(a);
fclose(alumnos);
if(buscar_archivo(alumnos,a.libreta)==false){
alumnos=fopen("alumnos.txt","ab");
fwrite(&a,sizeof(a),1,alumnos);
cantidad--;
}
else
cout<<"La libreta ya existe"<<endl;
}
fclose(alumnos);
}
Pero le he encontrado dos soluciones la primera es algo extraña, no me convence y es cambiar incluir un mensaje en la funcion de busqueda,
cosa que no se hace en funciones.
Es asi:
bool consulta(parchivo docentes, int codigo)
{
tdocente d;
bool encontrado=false;
docentes=fopen("docentes.txt","rb");
if(docentes!=NULL){
while(!feof(docentes) && !encontrado){
fread(&d,sizeof(d),1,docentes);
if(d.legajo==codigo)
encontrado=true;
cout<<"Encontrado: "<<encontrado<<endl;
}
}
fclose(docentes);
return encontrado;
}
Un poco raro bueno, y la ultima y mas clara diria yo es mantener el archivo abierto al mandar a preguntar si existe o no la clave del registro en
el archivo de registros, asi es como he logrado hacer andar este programa, pero no entiendo bien me explican?
void cargar_docentes(parchivo docentes)
{
tdocente d;
docentes=fopen("docentes.txt","ab+");
cargar(d);
if(consulta(docentes,d.legajo)==false)
fwrite(&d,sizeof(d),1,docentes);
else
cout<<"El numero de legajo ya existe"<<endl;
fclose(docentes);
}
Intenten agregar con el primer programa agregar como primer registro todos los campos en 1, no les deja pero si ponen todo 2 en los campos del registro si, me perdi muchachos ayuda.