Continuando con mis estudios de archivos y a pesar de que la solución sea muy sencilla de descubrir, les confieso que estoy como en un bucle mental, no logro parar el láser en el lugar adecuado.-
El error lo tengo en la última función, necesito verificar que el ingreso no sea duplicado, pero si bien en la función buscar me funciona, en está no.-
Código:
#include <stdio.h> #include <string.h> #include <windows.h> typedef struct{ char marcado; char ingles[30]; char espaniol[30]; }Traductor; void mainMenu(FILE *ptrFile); void agregar( FILE *ptrFile, Traductor *ptrTrad); void buscar( FILE *ptrFile, Traductor *ptrTrad); void listado( FILE *ptrFile, Traductor *ptrTrad); int validarAgregar( FILE *ptrFile, Traductor *ptrTrad, char temp[], int verAgre); int main(void){ FILE *ptrFile; if( ( ptrFile = fopen("archivo.txt","a+") ) == NULL ){ ferror( ptrFile ); } else{ mainMenu(ptrFile); fclose(ptrFile); } return 0; } void mainMenu(FILE *ptrFile){ Traductor trad; int opc=0, ch, ok, registros; long tam; tam=sizeof(trad); fseek(ptrFile, 0, SEEK_END); registros=ftell(ptrFile)/tam; while(opc != 4){ do{ system( "cls" ); printf( " \n\n====== Men%c principal ======\n\n", 163 ); printf( " 1 - Agregar\n" ); printf( " 2 - Buscar\n" ); printf( " 3 - Listado ===> total %d registro(s)\n", registros); printf( " 4 - Salir\n" ); printf( "\n\n Elija opci%cn.......: ",162 ); ok = scanf( "%d", &opc ) == 1 && opc >= 1 && opc <= 4; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); switch(opc){ case 1 : agregar( ptrFile, &trad ); break; case 2 : buscar( ptrFile, &trad ); break; case 3 : listado( ptrFile, &trad ); break; case 4 : break; } } } void agregar( FILE *ptrFile, Traductor *ptrTrad){ int opcGd, ch, ok, verAgre=0; char *p = NULL, temp[30]; do{ printf("\n ingl%cs.......: ", 130); fgets(ptrTrad->ingles, 30, stdin); if((p=strchr(ptrTrad->ingles, '\n'))){ *p='\0'; } else{ while((ch = getchar()) !='\n' && ch!=EOF); } ok = strlen(ptrTrad->ingles); }while(!ok); strcpy(temp, ptrTrad->ingles); verAgre = validarAgregar( ptrFile, ptrTrad, temp, verAgre); if( verAgre == 0){ do{ printf("\n traducci%cn...: ", 162); fgets(ptrTrad->espaniol, 30, stdin); if((p=strchr(ptrTrad->espaniol, '\n'))){ *p='\0'; } else{ while((ch = getchar()) !='\n' && ch!=EOF); } ok = strlen(ptrTrad->espaniol); }while(!ok); printf( "\n ======================================================" ); printf( "\n 1 - Grabar" ); printf( "\n 2 - Descartar" ); do{ printf( "\n\n Elija opci%cn......:", 162 ); ok = scanf( "%d", &opcGd ) == 1 && opcGd >= 1 && opcGd <= 2; while ((ch = getchar()) != EOF && ch != '\n'); }while(!ok); if(opcGd == 1){ fwrite(ptrTrad, sizeof(Traductor), 1, ptrFile); if( ferror(ptrFile) ){ printf( "\n No se pudo escribir en el archivo" ); } else printf( "\n Los datos se an grabado....."); } printf("\n\n\n Pulse [Enter] para volver al men%c principal....", 163); getchar(); } else{ printf( "\n\n La palabra ya existe..." ); printf("\n\n\n Pulse [Enter] para volver al men%c principal....", 163); getchar(); mainMenu(ptrFile); } } void buscar( FILE *ptrFile, Traductor *ptrTrad){ char buscar[30], *p = NULL; int ch, ok; do{ printf("\n\n Ingrece palabra a traducir.......: "); fgets(buscar, 30, stdin); if((p=strchr(buscar, '\n'))){ *p='\0'; } else{ while((ch = getchar()) !='\n' && ch!=EOF); } ok = strlen(buscar); }while(!ok); rewind(ptrFile); while (fread(ptrTrad, sizeof(Traductor), 1, ptrFile) == 1){ if( strstr(buscar, ptrTrad->espaniol) != NULL ){ printf( "\n Traducido al ingl%cs..............: %s", 130, ptrTrad->ingles); ok=0; break; } else if( strstr(buscar, ptrTrad->ingles) != NULL ){ printf( "\n Traducido al espa%col.............: %s", 164, ptrTrad->espaniol); ok=0; break; } } if(ok > 0){ printf( "\n No existe..." ); } printf("\n\n\n Pulse [Enter] para volver al men%c principal....", 163); getchar(); } void listado( FILE *ptrFile, Traductor *ptrTrad){ int bandera=0; rewind(ptrFile); while (fread(ptrTrad, sizeof(Traductor), 1, ptrFile) == 1){ if(bandera == 0){ printf("\n Ingl%cs Espa%col", 130, 164); bandera++; } printf("\n %7s %13s", ptrTrad->ingles, ptrTrad->espaniol); } if(bandera == 0){ printf("\n El archivo esta vacio....."); } printf("\n\n Pulse [Enter] para volver al men%c principal...", 163); getchar(); } int validarAgregar( FILE *ptrFile, Traductor *ptrTrad, char temp[], int verAgre){ while (fread(ptrTrad, sizeof(Traductor), 1, ptrFile) == 1){ if( strstr(temp, ptrTrad->ingles) != NULL ){ verAgre = 1; break; } } return verAgre; }
Es todo, desde ya muchas gracias por el tiempo.-
Saludos.
Daniel