#include #include #define FALSE 0 #define TRUE 1 #define ERROR -1 #define OK 0 #define LON_NOM_FICH 101 #define LON_NOMBRE 101 #define LON_DNI 15 #define LON_NOTA 10 #define LON_MAX 256 struct consulta { char nom_fich[LON_NOM_FICH]; char dni[LON_DNI]; }; struct insercion { char nom_fich[LON_NOM_FICH]; char nombre[LON_NOMBRE]; char dni[LON_DNI]; char nota[LON_NOTA]; }; struct resultado { int cod; char dat[LON_MAX]; }; struct resultado * consulta_servicio( struct consulta *ptr_con) { static struct resultado result; char linea[LON_MAX], linea2[LON_MAX]; FILE *f; int encontrado; /* Inicializacion resultado */ result.cod= 0; memset(result.dat, '\0', LON_MAX); /* Visualizar consulsta */ fprintf(stdout, "CONSULTA_SERVICIO:\n"); fprintf(stdout, "Fichero notas: %s\n", ptr_con->nom_fich); fprintf(stdout, "DNI: %s\n", ptr_con->dni); /* Apertura fichero notas para lectura */ f = fopen(ptr_con->nom_fich, "r"); if (f == NULL) { fprintf(stderr, "CONSULTA_SERVICIO: Error al abrir fichero de notas\n"); result.cod= ERROR; strcpy(result.dat, "CONSULTA: Error al abrir fichero de notas"); } else { encontrado= FALSE; while ( (!feof(f)) && (!encontrado) ) { /* Leer linea de fichero */ fgets(linea, LON_MAX, f); if (linea[strlen(linea)-1]=='\n') linea[strlen(linea)-1]= '\0'; // limpiar salto de linea final, si lo hay /* Analizar linea: se supone correcta la sintaxis del archivo */ if (linea!=NULL) { char *nombre, *dni, *nota; strcpy(linea2, linea); nombre= strtok(linea, "#"); // Primer token, el nombre if (nombre!=NULL) { dni= strtok(NULL, "#"); // Siguiente token, el dni nota= strtok(NULL, "#"); // Siguiente token, la nota if ((dni!=NULL) && (!strcmp(ptr_con->dni, dni)) ) { encontrado= TRUE; result.cod= OK; strcpy(result.dat, linea2); } } } } if (!encontrado) { result.cod= OK; strcpy(result.dat, "No encontrado"); } /* Cierre del fichero */ fclose(f); } /* Devolución resultado */ return (&result); } struct resultado * insercion_servicio( struct insercion *ptr_ins) { static struct resultado result; char linea[LON_MAX]; FILE *f; int encontrado; /* Inicializacion resultado */ result.cod= 0; memset(result.dat, '\0', LON_MAX); /* Visualizar insercion */ fprintf(stdout, "INSERCION_SERVICIO:\n"); fprintf(stdout, "Fichero notas: %s\n", ptr_ins->nom_fich); fprintf(stdout, "Nombre: %s\n", ptr_ins->nombre); fprintf(stdout, "DNI: %s\n", ptr_ins->dni); fprintf(stdout, "nota: %s\n", ptr_ins->nota); /* Apertura fichero notas para lectura/escritura */ f = fopen(ptr_ins->nom_fich, "r+"); if (f == NULL) { fprintf(stderr, "INSERCION_SERVICIO: Error al abrir fichero de notas\n"); result.cod= ERROR; strcpy(result.dat, "INSERCION: Error al abrir fichero de notas"); } else { encontrado= FALSE; while ( (!feof(f)) && (!encontrado) ) { /* Leer linea de fichero */ fgets(linea, LON_MAX, f); if (linea[strlen(linea)-1]=='\n') linea[strlen(linea)-1]= '\0'; // limpiar salto de linea final, si lo hay /* Analizar linea: se supone correcta la sintaxis del archivo */ if (linea!=NULL) { char *nombre, *dni, *nota; nombre= strtok(linea, "#"); // Primer token, el nombre if (nombre!=NULL) { dni= strtok(NULL, "#"); // Siguiente token, el dni nota= strtok(NULL, "#"); // Siguiente token, la nota if ( (dni!=NULL) && (!strcmp(ptr_ins->dni, dni))) { encontrado= TRUE; result.cod= ERROR; strcpy(result.dat, "INSERCION: Entrada ya existente"); } } } } if (!encontrado) { fseek(f, 0, SEEK_END); //Posicionarse al final del fichero fprintf(f, "%s#%s#%s\n", ptr_ins->nombre, ptr_ins->dni, ptr_ins->nota); // Escritura de datos en fichero result.cod= OK; strcpy(result.dat, "Insercion realizada"); } /* Cierre del fichero */ fclose(f); } /* Devolución resultado */ return (&result); } char *leerCadena(char *cadena, int longitud) { char *cad; cad= fgets(cadena, longitud, stdin); if (cadena[strlen(cadena)-1]=='\n') // Limpiar salto de linea cadena[strlen(cadena)-1]= '\0'; return cad; } void consulta() { struct consulta cons; struct resultado *ptr_result; /* Lectura datos consulta */ fprintf(stdout, "CONSULTA\n"); fprintf(stdout, "Nombre fichero: "); leerCadena((char *)&cons.nom_fich, LON_NOM_FICH); fprintf(stdout, "DNI: "); leerCadena((char *)&cons.dni, LON_DNI); /* Invocacion servicio */ ptr_result= consulta_servicio(&cons); /* Visualizacion respuesta servicio */ if (ptr_result->cod == ERROR) { fprintf(stderr, "CONSULTA: error (%s)\n", ptr_result->dat); } else { char *nombre, *dni, *nota; fprintf(stdout, "CONSULTA: ok \n"); /* analizar respuesta */ nombre= strtok(ptr_result->dat,"#"); dni= strtok(NULL,"#"); nota= strtok(NULL,"#"); fprintf(stdout, "Nombre: %s\n", nombre); fprintf(stdout, "DNI: %s\n", dni); fprintf(stdout, "Nota: %s\n", nota); } return; } void insercion() { struct insercion ins; struct resultado *ptr_result; /* Lectura datos insercion */ fprintf(stdout, "INSERCION\n"); fprintf(stdout, "Nombre fichero: "); leerCadena((char *)&ins.nom_fich, LON_NOM_FICH); fprintf(stdout, "Nombre: "); leerCadena((char *)&ins.nombre, LON_NOMBRE); fprintf(stdout, "DNI: "); leerCadena((char *)&ins.dni, LON_DNI); fprintf(stdout, "Nota: "); leerCadena((char *)&ins.nota, LON_NOTA); /* Invocacion servicio*/ ptr_result= insercion_servicio(&ins); /* Visualizacion respuesta servicio */ if (ptr_result->cod == ERROR) { fprintf(stderr, "INSERCION: error (%s)\n", ptr_result->dat); } else { fprintf(stdout, "INSERCION: ok\n"); } return; } int main( int argc, char *argv[]) { char entrada[9], *control_entrada; char opcion; if (argc!=1) { fprintf(stderr,"Uso: %s \n",argv[0]); exit(0); } /* Menu */ do { /* Presentar opciones */ fprintf(stdout, "\t\tMENU\n"); fprintf(stdout, "1. Consulta\n"); fprintf(stdout, "2. Insercion\n"); fprintf(stdout, "\n0. Terminar"); /* Leer opcion */ do { fprintf(stdout, "\nopcion? "); control_entrada= leerCadena(entrada,9); if (entrada!=NULL) opcion=entrada[0]; } while ((opcion<'0') || (opcion>'2') && (control_entrada!=NULL)); /* Procesar opcion */ switch (opcion) { case '1': consulta(); break; case '2': insercion(); break; } } while ((opcion!='0') && (control_entrada!=NULL)); return(0); }