30/03/2015, 12:26
|
|
No duplicar palabra al grabar en archivo [C] Hola gente, que tengan un muy buen día.-
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 |