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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Archivos en C/C++ problemas con valores de retorno
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Archivos en C/C++ problemas con valores de retorno  (Leído 1,662 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Archivos en C/C++ problemas con valores de retorno
« en: 2 Enero 2019, 03:04 am »

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:

Código
  1. #include <stdio.h>
  2. //EL PROBLEMA ESTA EN EL MODULO "void cargar_docentes(archivo docentes)"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. typedef char tcad[50];
  10. typedef struct tfecha{
  11. int dia;
  12. int mes;
  13. int anyo;
  14. };
  15. typedef struct tformacion{
  16. tcad titulo;
  17. tcad facultad;
  18. tcad universidad;
  19. };
  20. typedef struct tdocente{
  21. int legajo;
  22. tcad nombre_apellido;
  23. tfecha fecha_nac;
  24. tformacion educacion;
  25. int DNI;
  26. tcad cargo;
  27. };
  28. typedef FILE *parchivo;
  29.  
  30. void cargar(tdocente &docente);
  31. void mostrar(tdocente docente);
  32. void cargar_docentes(parchivo docentes);
  33. bool consulta(parchivo docentes, int codigo);
  34. void mostrar_docentes(parchivo docentes);
  35. void busqueda(parchivo docentes, int codigo);
  36. void modificar_docente(parchivo docentes, int codigo);
  37. void eliminar_docente(parchivo docentes, int codigo);
  38. void listar_docentes_especificos(parchivo docentes, tcad buscado);
  39. void nueva_cadena(tcad &cadena);
  40.  
  41. int main()
  42. {
  43. parchivo docentes;
  44. int opcion, codigo;
  45. tcad buscado;
  46. do{
  47. system("cls");
  48. cout<<"1. Cargar docente"<<endl;
  49. cout<<"2. Consultar docente"<<endl;
  50. cout<<"3. Listar docentes"<<endl;
  51. cout<<"4. Buscar docente"<<endl;
  52. cout<<"5. Modificar docente"<<endl;
  53. cout<<"6. Eliminar docente"<<endl;
  54. cout<<"7. Listar docentes por universidad"<<endl;
  55. cout<<"8. Salir"<<endl;
  56. cin>>opcion;
  57. switch(opcion){
  58. case 1: cargar_docentes(docentes);break;
  59. case 2: cout<<"Ingrese numero de legajo: ";
  60. cin>>codigo;
  61. if(consulta(docentes,codigo)==true)
  62. cout<<"Docente encontrado"<<endl;
  63. else
  64. cout<<"Docente no encontrado"<<endl;
  65. break;
  66. case 3: mostrar_docentes(docentes);break;
  67. case 4: cout<<"Ingrese numero de legajo: ";
  68. cin>>codigo;
  69. busqueda(docentes,codigo);break;
  70. case 5: cout<<"Ingrese numero de legajo: ";
  71. cin>>codigo;
  72. modificar_docente(docentes,codigo);break;
  73. case 6: cout<<"Ingrese numero de legajo: ";
  74. cin>>codigo;
  75. eliminar_docente(docentes,codigo);break;
  76. case 7: cout<<"Ingrese universidad: ";
  77. nueva_cadena(buscado);
  78. listar_docentes_especificos(docentes,buscado);break;
  79. case 8: cout<<"FIN DEL PROGRAMA"<<endl;break;
  80. default: cout<<"Opcion incorrecta"<<endl;
  81. }
  82. system("pause");
  83. }while(opcion!=8);
  84. }
  85.  
  86. void cargar(tdocente &docente)
  87. {
  88. cout<<"Ingrese datos del docente"<<endl;
  89. cout<<"Legajo: ";
  90. cin>>docente.legajo;
  91. cout<<"Nombre y apellido: ";
  92. nueva_cadena(docente.nombre_apellido);
  93. cout<<"Fecha de nadimiento DD/MM/AA"<<endl;
  94. cin>>docente.fecha_nac.dia;
  95. cin>>docente.fecha_nac.mes;
  96. cin>>docente.fecha_nac.anyo;
  97. cout<<"Formacion academica"<<endl;
  98. cout<<"Titulo: ";
  99. nueva_cadena(docente.educacion.titulo);
  100. cout<<"Facultad: ";
  101. nueva_cadena(docente.educacion.facultad);
  102. cout<<"Universidad: ";
  103. nueva_cadena(docente.educacion.universidad);
  104. cout<<"DNI: ";
  105. cin>>docente.DNI;
  106. cout<<"Cargo: ";
  107. nueva_cadena(docente.cargo);
  108. }
  109.  
  110. void mostrar(tdocente docente)
  111. {
  112. cout<<"Datos del docente"<<endl;
  113. cout<<"Legajo: "<<docente.legajo<<endl;
  114. cout<<"Nombre y apellido: "<<docente.nombre_apellido<<endl;
  115. cout<<"Fecha de nadimiento:"<<docente.fecha_nac.dia<<"/"<<docente.fecha_nac.mes<<"/"<<docente.fecha_nac.anyo<<endl;
  116. cout<<"Formacion academica"<<endl;
  117. cout<<"Titulo: "<<docente.educacion.titulo<<endl;
  118. cout<<"Facultad: "<<docente.educacion.facultad<<endl;
  119. cout<<"Universidad: "<<docente.educacion.universidad<<endl;
  120. cout<<"DNI: "<<docente.DNI<<endl;
  121. cout<<"Cargo: "<<docente.cargo<<endl<<endl;
  122. }
  123. //EL PROBLEMA ES ESTE MODULO
  124. void cargar_docentes(parchivo docentes)
  125. {
  126. tdocente d;
  127. docentes=fopen("docentes.txt","ab+");
  128. cargar(d);
  129. fclose(docentes);
  130. if(consulta(docentes,d.legajo)==false){
  131. docentes=fopen("docentes.txt","ab");
  132. fwrite(&d,sizeof(d),1,docentes);
  133. }
  134. else
  135. cout<<"El numero de legajo ya existe"<<endl;
  136. fclose(docentes);
  137. }
  138.  
  139. bool consulta(parchivo docentes, int codigo)
  140. {
  141. tdocente d;
  142. bool encontrado=false;
  143. docentes=fopen("docentes.txt","rb");
  144. if(docentes!=NULL){
  145. while(!feof(docentes) && !encontrado){
  146. fread(&d,sizeof(d),1,docentes);
  147. if(d.legajo==codigo)
  148. encontrado=true;
  149. }
  150. }
  151. fclose(docentes);
  152. return encontrado;
  153. }
  154.  
  155. void mostrar_docentes(parchivo docentes)
  156. {
  157. tdocente d;
  158. docentes=fopen("docentes.txt","rb");
  159. if(docentes==NULL)
  160. cout<<"No se pudo abrir el archivo"<<endl;
  161. else{
  162. while(!feof(docentes)){
  163. fread(&d,sizeof(d),1,docentes);
  164. if(!feof(docentes))
  165. mostrar(d);
  166. }
  167. }
  168. fclose(docentes);
  169. }
  170.  
  171. void busqueda(parchivo docentes, int codigo)
  172. {
  173. tdocente d;
  174. bool encontrado=false;
  175. docentes=fopen("docentes.txt","rb");
  176. if(docentes==NULL)
  177. cout<<"No se pudo abrir el archivo"<<endl;
  178. else{
  179. while(!feof(docentes) && !encontrado){
  180. fread(&d,sizeof(d),1,docentes);
  181. if(d.legajo==codigo){
  182. mostrar(d);
  183. encontrado=true;
  184. }
  185. }
  186. if(encontrado==false)
  187. cout<<"Docente no encontrado"<<endl;
  188. }
  189. fclose(docentes);
  190. }
  191.  
  192. void modificar_docente(parchivo docentes, int codigo)
  193. {
  194. tdocente d;
  195. bool encontrado=false;
  196. docentes=fopen("docentes.txt","rb+");
  197. if(docentes==NULL)
  198. cout<<"No se pudo abrir el archivo"<<endl;
  199. else{
  200. while(!feof(docentes) && !encontrado){
  201. fread(&d,sizeof(d),1,docentes);
  202. if(codigo==d.legajo)
  203. encontrado=true;
  204. }
  205. if(encontrado==true){
  206. cargar(d);
  207. fseek(docentes,-sizeof(d),1);
  208. fwrite(&d,sizeof(d),1,docentes);
  209. }
  210. else
  211. cout<<"Docente no encontrado"<<endl;
  212. }
  213. fclose(docentes);
  214. }
  215.  
  216. void eliminar_docente(parchivo docentes, int codigo)
  217. {
  218. tdocente d;
  219. parchivo temporal;
  220. docentes=fopen("docentes.txt","rb");
  221. temporal=fopen("temporal.txt","wb");
  222. if(docentes==NULL){
  223. cout<<"ARCHIVO INEXISTENTE"<<endl;
  224. fclose(docentes);
  225. fclose(temporal);
  226. }
  227. else{
  228. while(!feof(docentes)){
  229. fread(&d,sizeof(d),1,docentes);
  230. if(!feof(docentes) && d.legajo!=codigo)
  231. fwrite(&d,sizeof(d),1,temporal);
  232. }
  233. fclose(docentes);
  234. fclose(temporal);
  235. if(remove("docentes.txt")==0)
  236. rename("temporal.txt","docentes.txt");
  237. else
  238. cout<<"ERROR AL ELIMINAR"<<endl;
  239. }
  240. }
  241.  
  242. void listar_docentes_especificos(parchivo docentes, tcad buscado)
  243. {
  244. tdocente d;
  245. docentes=fopen("docentes.txt","rb");
  246. if(docentes==NULL)
  247. cout<<"No se pudo abrir el archivo"<<endl;
  248. else{
  249. while(!feof(docentes)){
  250. fread(&d,sizeof(d),1,docentes);
  251. if(!feof(docentes) && strcmp(d.educacion.universidad,buscado)==0)
  252. mostrar(d);
  253. }
  254. }
  255. fclose(docentes);
  256. }
  257.  
  258. void nueva_cadena(tcad &cadena)
  259. {
  260. fflush(stdin);
  261. gets(cadena);
  262. fflush(stdin);
  263. }

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:

Código
  1. void agregar_alumnos(parchivo alumnos)
  2. {
  3. talumno a;
  4. int cantidad;
  5. alumnos=fopen("alumnos.txt","wb");
  6. cout<<"Cuántos registros desea guardar: ";
  7. cin>>cantidad;
  8. while(cantidad>0){
  9. carga(a);
  10. fclose(alumnos);
  11. if(buscar_archivo(alumnos,a.libreta)==false){
  12. alumnos=fopen("alumnos.txt","ab");
  13. fwrite(&a,sizeof(a),1,alumnos);
  14. cantidad--;
  15. }
  16. else
  17. cout<<"La libreta ya existe"<<endl;
  18. }
  19. fclose(alumnos);
  20. }

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:
Código
  1. bool consulta(parchivo docentes, int codigo)
  2. {
  3. tdocente d;
  4. bool encontrado=false;
  5. docentes=fopen("docentes.txt","rb");
  6. if(docentes!=NULL){
  7. while(!feof(docentes) && !encontrado){
  8. fread(&d,sizeof(d),1,docentes);
  9. if(d.legajo==codigo)
  10. encontrado=true;
  11. cout<<"Encontrado: "<<encontrado<<endl;
  12. }
  13. }
  14. fclose(docentes);
  15. return encontrado;
  16. }

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?

Código
  1. void cargar_docentes(parchivo docentes)
  2. {
  3. tdocente d;
  4. docentes=fopen("docentes.txt","ab+");
  5. cargar(d);
  6. if(consulta(docentes,d.legajo)==false)
  7. fwrite(&d,sizeof(d),1,docentes);
  8. else
  9. cout<<"El numero de legajo ya existe"<<endl;
  10. fclose(docentes);
  11. }

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.  :-(


En línea

7w7
fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Archivos en C/C++ problemas con valores de retorno
« Respuesta #1 en: 2 Enero 2019, 23:05 pm »

En:

Código
  1. void cargar_docentes(parchivo docentes)
  2. {
  3. tdocente d;
  4. docentes=fopen("docentes.txt","ab+");
  5. cargar(d);
  6. fclose(docentes);
  7. if(consulta(docentes,d.legajo)==false){
  8. docentes=fopen("docentes.txt","ab");
  9. fwrite(&d,sizeof(d),1,docentes);
  10. }
  11. else
  12. cout<<"El numero de legajo ya existe"<<endl;
  13. fclose(docentes);
  14. }
  15.  

Si el if no se cumple no abres el archivo.... ¿No?

¿Así funciona?

Código
  1. void cargar_docentes(parchivo docentes)
  2. {
  3. tdocente d;
  4. docentes=fopen("docentes.txt","ab+");
  5. cargar(d);
  6. fclose(docentes);
  7. if(consulta(docentes,d.legajo)==false){
  8. docentes=fopen("docentes.txt","ab");
  9. fwrite(&d,sizeof(d),1,docentes);
  10.                fclose(docentes);
  11. }else{
  12. cout<<"El numero de legajo ya existe"<<endl;
  13.        }
  14. }

saludos!



En línea

Un byte a la izquierda.
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Archivos en C/C++ problemas con valores de retorno
« Respuesta #2 en: 2 Enero 2019, 23:30 pm »

¿Así funciona?

Código
  1. void cargar_docentes(parchivo docentes)
  2. {
  3. tdocente d;
  4. docentes=fopen("docentes.txt","ab+");
  5. cargar(d);
  6. fclose(docentes);
  7. if(consulta(docentes,d.legajo)==false){
  8. docentes=fopen("docentes.txt","ab");
  9. fwrite(&d,sizeof(d),1,docentes);
  10.                fclose(docentes);
  11. }else{
  12. cout<<"El numero de legajo ya existe"<<endl;
  13.        }
  14. }

saludos!



No, no funciona, saludos
« Última modificación: 2 Enero 2019, 23:32 pm por Beginner Web » En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Archivos en C/C++ problemas con valores de retorno
« Respuesta #3 en: 3 Enero 2019, 12:28 pm »

¿Por qué haces esto?

Código:
docentes=fopen("docentes.txt","ab+");
cargar(d);
fclose(docentes);

Por otra parte y cómo se ha repetido muchas veces: es un error cargar una estructura directamente a un archivo y recuperarla de él totalmente.
C/C++ puede mover los miembros de las estructuras y dejar espacios vacíos entre ellos para que se ajusten en la memoria. En algunas plataformas esto se soluciona serializando estos datos. Pero una forma rápida de resolverlo es grabando en disco miembro a miembro y a la hora de sacarlas leyendo miembro a miembro en el mismo orden.
Si no lo haces de esta forma puede que creas que estas leyendo legajo cuando en realidad estás leyendo nombre_apellidos, por ejemplo.

Me he tomado la libertad de hacerle algunos arreglillos, sobre todo para el tema de que el tamaño teórico de una estructura no es el real y alguna que otra cosa con el manejo de los archivos. Aún así necesita aun muchas mejoras: validar fechas, recibir el tipo de dato esperado desde la consola y toda una larga lista de etcéteras. También lo he pasado a C (C++ no me gusta).

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #define MAX_CADENA 50
  6.  
  7. typedef struct tfecha {
  8.    int dia;
  9.    int mes;
  10.    int anyo;
  11. } fecha;
  12.  
  13. typedef struct tformacion {
  14.    char titulo[MAX_CADENA];
  15.    char facultad[MAX_CADENA];
  16.    char universidad[MAX_CADENA];
  17. } formacion;
  18.  
  19. typedef struct tdocente {
  20.    int legajo;
  21.    char nombre_apellido[MAX_CADENA];
  22.    fecha fecha_nac;
  23.    formacion educacion;
  24.    int DNI;
  25.    char cargo[MAX_CADENA];
  26. } docente;
  27.  
  28. void grabar_registro(docente *registro, FILE *archivo);
  29. void leer_registro(docente *registro, FILE *archivo);
  30. void cargar(docente *individuo);
  31. void mostrar(docente *individuo);
  32. void cargar_docentes(char * const nombre_archivo);
  33. bool consulta(char * const nombre_archivo, int codigo);
  34. void mostrar_docentes(char * const nombre_archivo);
  35. void busqueda(char * const nombre_archivo, int codigo);
  36. void modificar_docente(char * const nombre_archivo, int codigo);
  37. void eliminar_docente(char * const nombre_archivo, int codigo);
  38. void listar_docentes_especificos(char * const nombre_archivo, char * const buscado);
  39. void nueva_cadena(char cadena[]);
  40.  
  41. int main() {
  42.    char *docentes = "docentes.txt";
  43.    int opcion, codigo;
  44.    char buscado[MAX_CADENA];
  45.    do {
  46.        system("cls");
  47.        puts("1. Cargar docente");
  48.        puts("2. Consultar docente");
  49.        puts("3. Listar docentes");
  50.        puts("4. Buscar docente");
  51.        puts("5. Modificar docente");
  52.        puts("6. Eliminar docente");
  53.        puts("7. Listar docentes por universidad");
  54.        puts("8. Salir");
  55.        printf("\n> ");
  56.        scanf("%d", &opcion);
  57.        switch(opcion) {
  58.        case 1:
  59.            cargar_docentes(docentes);
  60.            break;
  61.        case 2:
  62.            printf("Ingrese numero de legajo: ");
  63.            scanf("%d", &codigo);
  64.            if(consulta(docentes, codigo))
  65.                puts("Docente encontrado");
  66.            else
  67.                puts("Docente no encontrado");
  68.            break;
  69.        case 3:
  70.            mostrar_docentes(docentes);
  71.            break;
  72.        case 4:
  73.            printf("Ingrese numero de legajo: ");
  74.            scanf("%d", &codigo);
  75.            busqueda(docentes, codigo);
  76.            break;
  77.        case 5:
  78.            printf("Ingrese numero de legajo: ");
  79.            scanf("%d", &codigo);
  80.            modificar_docente(docentes, codigo);
  81.            break;
  82.        case 6:
  83.            printf("Ingrese numero de legajo: ");
  84.            scanf("%d", &codigo);
  85.            eliminar_docente(docentes, codigo);
  86.            break;
  87.        case 7:
  88.            printf("Ingrese universidad: ");
  89.            nueva_cadena(buscado);
  90.            listar_docentes_especificos(docentes, buscado);
  91.            break;
  92.        case 8:
  93.            puts("FIN DEL PROGRAMA");
  94.            break;
  95.        default:
  96.            puts("Opcion incorrecta");
  97.        }
  98.        system("pause");
  99.    } while(opcion!=8);
  100. }
  101.  
  102. void grabar_registro(docente *registro, FILE *archivo) {
  103.    fwrite(&registro->legajo, sizeof(int), 1, archivo);
  104.    fwrite(registro->nombre_apellido, sizeof(char), MAX_CADENA, archivo);
  105.    fwrite(&registro->fecha_nac.dia, sizeof(int), 1, archivo);
  106.    fwrite(&registro->fecha_nac.mes, sizeof(int), 1, archivo);
  107.    fwrite(&registro->fecha_nac.anyo, sizeof(int), 1, archivo);
  108.    fwrite(registro->educacion.titulo, sizeof(char), MAX_CADENA, archivo);
  109.    fwrite(registro->educacion.facultad, sizeof(char), MAX_CADENA, archivo);
  110.    fwrite(registro->educacion.universidad, sizeof(char), MAX_CADENA, archivo);
  111.    fwrite(&registro->DNI, sizeof(int), 1, archivo);
  112.    fwrite(registro->cargo, sizeof(char), MAX_CADENA, archivo);
  113. }
  114.  
  115. void leer_registro(docente *registro, FILE *archivo) {
  116.    fread(&registro->legajo, sizeof(int), 1, archivo);
  117.    fread(registro->nombre_apellido, sizeof(char), MAX_CADENA, archivo);
  118.    fread(&registro->fecha_nac.dia, sizeof(int), 1, archivo);
  119.    fread(&registro->fecha_nac.mes, sizeof(int), 1, archivo);
  120.    fread(&registro->fecha_nac.anyo, sizeof(int), 1, archivo);
  121.    fread(registro->educacion.titulo, sizeof(char), MAX_CADENA, archivo);
  122.    fread(registro->educacion.facultad, sizeof(char), MAX_CADENA, archivo);
  123.    fread(registro->educacion.universidad, sizeof(char), MAX_CADENA, archivo);
  124.    fread(&registro->DNI, sizeof(int), 1, archivo);
  125.    fread(registro->cargo, sizeof(char), MAX_CADENA, archivo);
  126. }
  127.  
  128. void cargar(docente *individuo) {
  129.    puts("Ingrese datos del docente");
  130.    printf("Legajo: ");
  131.    scanf("%d", &individuo->legajo);
  132.    printf("Nombre y apellido: ");
  133.    nueva_cadena(individuo->nombre_apellido);
  134.    puts("Fecha de nacimiento...");
  135.    printf("Dia: ");
  136.    scanf("%d", &individuo->fecha_nac.dia);
  137.    printf("Mes: ");
  138.    scanf("%d", &individuo->fecha_nac.mes);
  139.    printf("Anyo: ");
  140.    scanf("%d", &individuo->fecha_nac.anyo);
  141.    puts("Formacion academica");
  142.    printf("Titulo: ");
  143.    nueva_cadena(individuo->educacion.titulo);
  144.    printf("Facultad: ");
  145.    nueva_cadena(individuo->educacion.facultad);
  146.    printf("Universidad: ");
  147.    nueva_cadena(individuo->educacion.universidad);
  148.    printf("DNI: ");
  149.    scanf("%d", &individuo->DNI);
  150.    printf("Cargo: ");
  151.    nueva_cadena(individuo->cargo);
  152. }
  153.  
  154. void mostrar(docente *individuo) {
  155.    puts("Datos del docente");
  156.    printf("Legajo: %d\n", individuo->legajo);
  157.    printf("Nombre y apellido: %s\n", individuo->nombre_apellido);
  158.    printf("Fecha de nacimiento: %d/%d/%d\n", individuo->fecha_nac.dia, individuo->fecha_nac.mes, individuo->fecha_nac.anyo);
  159.    puts("Formacion academica");
  160.    printf("Titulo: %s\n", individuo->educacion.titulo);
  161.    printf("Facultad: %s\n", individuo->educacion.facultad);
  162.    printf("Universidad: %s\n", individuo->educacion.universidad);
  163.    printf("DNI: %d\n", individuo->DNI);
  164.    printf("Cargo: %s\n\n", individuo->cargo);
  165. }
  166.  
  167. void cargar_docentes(char * const nombre_archivo) {
  168.    docente d;
  169.    FILE *fp;
  170.    cargar(&d);
  171.    if(consulta(nombre_archivo, d.legajo)==false) {
  172.        fp=fopen(nombre_archivo, "ab");
  173.        grabar_registro(&d, fp);
  174.        fclose(fp);
  175.    }
  176.    else
  177.        puts("El numero de legajo ya existe");
  178. }
  179.  
  180. bool consulta(char * const nombre_archivo, int codigo) {
  181.    docente d;
  182.    char c;
  183.    bool encontrado=false;
  184.    FILE *fp=fopen(nombre_archivo,"rb");
  185.    if(fp) {
  186.        c=fgetc(fp);
  187.        while(!feof(fp) && !encontrado) {
  188.            ungetc(c, fp);
  189.            leer_registro(&d, fp);
  190.            if(d.legajo==codigo)
  191.                encontrado=true;
  192.            c=fgetc(fp);
  193.        }
  194.    }
  195.    fclose(fp);
  196.    return encontrado;
  197. }
  198.  
  199. void mostrar_docentes(char * const nombre_archivo) {
  200.    docente d;
  201.    char c;
  202.    FILE *fp=fopen(nombre_archivo, "rb");
  203.    if(!fp) {
  204.        puts("No se pudo abrir el archivo");
  205.        return;
  206.    }
  207.    c=fgetc(fp);
  208.    while(!feof(fp)) {
  209.        ungetc(c, fp);
  210.        leer_registro(&d, fp);
  211.        mostrar(&d);
  212.        c=fgetc(fp);
  213.    }
  214.    fclose(fp);
  215. }
  216.  
  217. void busqueda(char * const nombre_archivo, int codigo) {
  218.    docente d;
  219.    char c;
  220.    bool encontrado=false;
  221.    FILE *fp=fopen(nombre_archivo, "rb");
  222.    if(!fp) {
  223.        puts("No se pudo abrir el archivo");
  224.        return;
  225.    }
  226.    c=fgetc(fp);
  227.    while(!feof(fp) && !encontrado) {
  228.        ungetc(c, fp);
  229.        leer_registro(&d, fp);
  230.        if(d.legajo==codigo) {
  231.            mostrar(&d);
  232.            encontrado=true;
  233.        }
  234.        c=fgetc(fp);
  235.    }
  236.    if(encontrado==false)
  237.        puts("Docente no encontrado");
  238.    fclose(fp);
  239. }
  240.  
  241. void modificar_docente(char * const nombre_archivo, int codigo) {
  242.    docente d;
  243.    char c;
  244.    long int posicion = 0;
  245.    bool encontrado=false;
  246.    FILE *fp=fopen(nombre_archivo, "rb+");
  247.    if(!fp) {
  248.        puts("No se pudo abrir el archivo");
  249.        return;
  250.    }
  251.    c=fgetc(fp);
  252.    while(!feof(fp) && !encontrado) {
  253.        ungetc(c, fp);
  254.        leer_registro(&d, fp);
  255.        if(codigo==d.legajo)
  256.            encontrado=true;
  257.        else
  258.            posicion = ftell(fp);
  259.        c=fgetc(fp);
  260.    }
  261.    if(encontrado) {
  262.        ungetc(c, fp);
  263.        cargar(&d);
  264.        fseek(fp, posicion, SEEK_SET);
  265.        grabar_registro(&d, fp);
  266.    }
  267.    else
  268.        puts("Docente no encontrado");
  269.    fclose(fp);
  270. }
  271.  
  272. void eliminar_docente(char * const nombre_archivo, int codigo) {
  273.    const char *nombre_temporal = "temporal.txt";
  274.    docente d;
  275.    char c;
  276.    FILE *fp;
  277.    FILE *temporal;
  278.    fp=fopen(nombre_archivo, "rb");
  279.    if(!fp) {
  280.        printf("No se puede abrir el archivo %s\n", nombre_archivo);
  281.        return;
  282.    }
  283.    temporal=fopen(nombre_temporal, "wb");
  284.    if(!temporal) {
  285.        puts("No se pudo generar el archivo temporal.");
  286.        fclose(fp);
  287.        return;
  288.    }
  289.    c=fgetc(fp);
  290.    while(!feof(fp)) {
  291.        ungetc(c, fp);
  292.        leer_registro(&d, fp);
  293.        if(!feof(fp) && d.legajo!=codigo)
  294.            grabar_registro(&d, temporal);
  295.        c=fgetc(fp);
  296.    }
  297.    fclose(fp);
  298.    fclose(temporal);
  299.    if(remove(nombre_archivo)==0)
  300.        rename(nombre_temporal, nombre_archivo);
  301.    else
  302.        puts("ERROR AL ELIMINAR");
  303. }
  304.  
  305. void listar_docentes_especificos(char * const nombre_archivo, char * const buscado) {
  306.    docente d;
  307.    char c;
  308.    FILE *fp = fopen(nombre_archivo, "rb");
  309.    if(!fp) {
  310.        puts("No se pudo abrir el archivo");
  311.        return;
  312.    }
  313.    c=fgetc(fp);
  314.    while(!feof(fp)) {
  315.        ungetc(c, fp);
  316.        leer_registro(&d, fp);
  317.        if(strcmp(d.educacion.universidad, buscado)==0)
  318.            mostrar(&d);
  319.        c=fgetc(fp);
  320.    }
  321.    fclose(fp);
  322. }
  323.  
  324. void nueva_cadena(char cadena[]) {
  325.    char *c;
  326.    fseek(stdin, 0, SEEK_END);
  327.    fgets(cadena, MAX_CADENA, stdin);
  328.    c = strchr(cadena, '\n');
  329.    if(c)
  330.        *c = '\0';
  331.    fseek(stdin, 0, SEEK_END);
  332. }
« Última modificación: 3 Enero 2019, 18:53 pm por MAFUS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problemas con direct3d en el retorno del rey
Juegos y Consolas
iceland 0 1,979 Último mensaje 7 Abril 2004, 21:12 pm
por iceland
Return Valores de retorno
Programación C/C++
CATBro 3 7,814 Último mensaje 22 Diciembre 2010, 01:15 am
por 08l00D
como modificar archivos de manera forzada o no permitir valores por default?
GNU/Linux
Belial & Grimoire 2 2,744 Último mensaje 9 Julio 2013, 20:14 pm
por cronos426
Problemas con asignación de valores en un array
Scripting
Neofito_2017 0 1,894 Último mensaje 3 Abril 2017, 17:06 pm
por Neofito_2017
Modificar valores Hex en múltiples archivos
Ingeniería Inversa
Misomeister 2 3,762 Último mensaje 29 Mayo 2017, 18:52 pm
por animanegra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines