Hola amigos, necesito me ayuden con unos problemas que tengo en mi programa, no entiendo por qué no funciona:
Ingresar al Sistema.
Se pide por teclado que ingrese el usuario y luego la contraseña, se compara con lo que hay en el archivo accesobanco.text; de existir dicho usuario/contraseña, se muestra mensaje: "acceso exitoso".
Si no existe el usuario, se muestra mensaje: "usuario incorrecto".
Si la contraseña es equivocada, se muestra mensaje: "contraseña incorrecta". Si la contraseña digitada no es correcta, se da la oportunidad de volver a ingresar la contraseña, si en 3 oportunidades falla al ingresar la contraseña, se bloquea el acceso al sistema para ese usuario en este momento.
void ingresarsistema()
{
FILE *p;
char S1[9], S2[5], ch;
char user[9], pass[5], tmp[5];
int f1=0, i;
p = fopen("accesobanco.txt", "r");
printf("User: ");
scanf("%s", user);
printf("\nPassword: ");
fflush(stdin);
scanf("%s", pass);
while(!feof(p))
{
fscanf(p, "%[^,], %[^\n]\n", S1, S2);
if(strcmp(user, S1) == 0) /*Se compara cadenas de usuarios*/
{
f1=1;
strcpy(tmp, S2);
if(strcmp(pass, S2) == 0) /*Se compara cadenas de contraseñas*/
{
printf("\nAcceso Exitoso\n");
return;
}
}
if(f1 == 0)
{
printf("\nUsuario Incorrecto\n");
}
else
{
printf("\nContraseña Incorrecta");
for(i=0; i<2; i++)
{
printf("\nVuelva a ingresar la contrasenia: ");
fflush(stdin);
scanf("%s", pass);
{
printf("\nAcceso Exitoso\n");
return;
}
}
printf("\nEl sistema ha sido bloqueado\n");
}
}
fclose ( p );
}
Agradecería mucho su ayuda.
¿Que problema tienes?
Acabo de hacer una prueba y funciona bien. Lo único que no funciona son lo de las 3 oportunidades. ¿Tienes el problema con eso?
Cita de: Maik33 en 4 Febrero 2013, 09:05 AM
¿Que problema tienes?
Acabo de hacer una prueba y funciona bien. Lo único que no funciona son lo de las 3 oportunidades. ¿Tienes el problema con eso?
Exacto, no me funcionan las 3 oportunidades.
for(i=0; i<2; i++)
{
printf("\nVuelva a ingresar la contrasenia: ");
fflush(stdin);
scanf("%s", pass);
{
printf("\nAcceso Exitoso\n");
return;
}
}
No falta aquí un if?
Si, cuando lees la contraseña por segunda vez, no comparas con nada, y por eso siempre te da "Acceso Exitoso".
Cita de: amchacon en 4 Febrero 2013, 10:35 AM
for(i=0; i<2; i++)
{
printf("\nVuelva a ingresar la contrasenia: ");
fflush(stdin);
scanf("%s", pass);
{
printf("\nAcceso Exitoso\n");
return;
}
}
No falta aquí un if?
un error mío al subir el codigo y borrar comentarios:
for(i=0; i<2; i++)
{
printf("\nVuelva a ingresar la contrasenia: ");
fflush(stdin);
scanf("%s", pass);
if(strcmp(pass, tmp) == 0);
{
printf("\nAcceso Exitoso\n");
return;
}
}
con ese if lo tengo y no funciona
Ya he encontrado el fallo.
if(strcmp(pass, tmp) == 0);
{
printf("\nAcceso Exitoso\n");
return;
}
En la comparacion tienes:
if(strcmp(pass,tmp)==0);
El punto y coma, hace que siempre se ejecute lo que hay despues del if.
Cita de: Maik33 en 4 Febrero 2013, 14:11 PM
Ya he encontrado el fallo.
if(strcmp(pass, tmp) == 0);
{
printf("\nAcceso Exitoso\n");
return;
}
En la comparacion tienes:
if(strcmp(pass,tmp)==0);
El punto y coma, hace que siempre se ejecute lo que hay despues del if.
era de madrugada, disculpen, los subí mal, pero en mi programa si lo tengo sin el ; en cuanto a sintaxis creo que esta correcto, pero aun así no funciona
Al observar tu código me di cuenta que haces fflush al flujo de entrada, pásate por los siguientes enlaces:
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
Documentación de fflush
http://linux.die.net/man/3/fflush
Cita de: naderST en 4 Febrero 2013, 16:06 PM
Al observar tu código me di cuenta que haces fflush al flujo de entrada, pásate por los siguientes enlaces:
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
Documentación de fflush
http://linux.die.net/man/3/fflush
De hecho el programa lo hice en linux, al pasarlo a windows le puse el fflush, de todas manera si lo quito o borro el buffer con while(getchar()!='\n'); el programa sigue sin funcionar.
Un error de diseño: solo puedes indicar que un nombre de usuario no es valido después de verificar todos los nombres, esa comprobación la debes colocar después del bucle donde lees todos los pares nombre + contraseña.
Por otra parte si se crea el archivo de datos el programa funciona correctamente salvo los detalles mencionados como fflush(stdin).
Tal vez el error se deba al contenido de tu archivo "accesobanco.txt", revisalo.
Un saludo
Si el archivo no esta creado cuando ejecutas el programa, tengo entendido que fopen() no lo crea si le pasas "r" como modo de apertura.
Saludos.
Cita de: 0xDani en 4 Febrero 2013, 17:26 PM
Si el archivo no esta creado cuando ejecutas el programa, tengo entendido que fopen() no lo crea si le pasas "r" como modo de apertura.
Saludos.
El archivo se crea con otra funcion, en el menu del programa se debe crear el archivo con una funcion sino no entra a la funcion de comprobacion, eso esta validado
Cita de: rir3760 en 4 Febrero 2013, 17:16 PM
Un error de diseño: solo puedes indicar que un nombre de usuario no es valido después de verificar todos los nombres, esa comprobación la debes colocar después del bucle donde lees todos los pares nombre + contraseña.
Por otra parte si se crea el archivo de datos el programa funciona correctamente salvo los detalles mencionados como fflush(stdin).
Tal vez el error se deba al contenido de tu archivo "accesobanco.txt", revisalo.
Un saludo
El contenido del erchivo es de esta manera:
user, password
user, password
user, password
user, password
Esta funcion crea el archivo:
void opcion1()
{
FILE *p;
p = fopen("accesobanco.txt", "w++");
fprintf(p, "%s, %s","useras34", "ae78");
fprintf(p, "%s, %s","\nuseras32", "ui99");
fprintf(p, "%s, %s","\nuseras45", "eo76");
fprintf(p, "%s, %s","\nuserasg6", "ie44");
fclose ( p );
}
Me parece que el formato que le estás dando a tu archivo no es el correcto, prueba con esto:
void opcion1()
{
FILE *p;
p = fopen("accesobanco.txt", "w");
fprintf(p, "%s, %s","useras34", "ae78\n");
fprintf(p, "%s, %s","\nuseras32", "ui99\n");
fprintf(p, "%s, %s","\nuseras45", "eo76\n");
fprintf(p, "%s, %s","\nuserasg6", "ie44\n\n");
fclose ( p );
}
"w++" no es ningun modo de apertura valido para fopen(), supongo que sera "w+".
Cita de: naderST en 4 Febrero 2013, 18:21 PM
Me parece que el formato que le estás dando a tu archivo no es el correcto, prueba con esto:
void opcion1()
{
FILE *p;
p = fopen("accesobanco.txt", "w");
fprintf(p, "%s, %s","useras34", "ae78\n");
fprintf(p, "%s, %s","\nuseras32", "ui99\n");
fprintf(p, "%s, %s","\nuseras45", "eo76\n");
fprintf(p, "%s, %s","\nuserasg6", "ie44\n\n");
fclose ( p );
}
Lo volví a probar en linux y me funcionó, si lo voy ejecutando por pasos se llena de basura en visual studio.
fgets( S1, sizeof(S1), stdin );
De todos modos muchas gracias.
Saludos.