Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/03/2015, 12:26
rdv316
Invitado
 
Mensajes: n/a
Puntos:
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