Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jscrip en 4 Febrero 2013, 07:57 am



Título: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 07:57 am
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.

Código:
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.


Título: Re: Ayuda con Archivos
Publicado por: 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?


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 09:10 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.


Título: Re: Ayuda con Archivos
Publicado por: amchacon en 4 Febrero 2013, 10:35 am
Código
  1. for(i=0; i<2; i++)
  2. {
  3.    printf("\nVuelva a ingresar la contrasenia: ");
  4.    fflush(stdin);
  5.    scanf("%s", pass);
  6.    {
  7.        printf("\nAcceso Exitoso\n");
  8.        return;
  9.    }
  10. }
  11.  
No falta aquí un if?


Título: Re: Ayuda con Archivos
Publicado por: Maik33 en 4 Febrero 2013, 10:38 am
Si, cuando lees la contraseña por segunda vez, no comparas con nada, y por eso siempre te da "Acceso Exitoso".


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 10:50 am
Código
  1. for(i=0; i<2; i++)
  2. {
  3.    printf("\nVuelva a ingresar la contrasenia: ");
  4.    fflush(stdin);
  5.    scanf("%s", pass);
  6.    {
  7.        printf("\nAcceso Exitoso\n");
  8.        return;
  9.    }
  10. }
  11.  
No falta aquí un if?
un error mío al subir el codigo y borrar comentarios:
Código
  1. for(i=0; i<2; i++)
  2. {
  3.    printf("\nVuelva a ingresar la contrasenia: ");
  4.    fflush(stdin);
  5.    scanf("%s", pass);
  6.    if(strcmp(pass, tmp) == 0);
  7.    {
  8.        printf("\nAcceso Exitoso\n");
  9.        return;
  10.    }
  11. }
  12.  
con ese if lo tengo y no funciona


Título: Re: Ayuda con Archivos
Publicado por: Maik33 en 4 Febrero 2013, 14:11 pm
Ya he encontrado el fallo.

Código
  1. if(strcmp(pass, tmp) == 0);
  2.   {
  3.       printf("\nAcceso Exitoso\n");
  4.       return;
  5.   }

En la comparacion tienes:
if(strcmp(pass,tmp)==0);

El punto y coma, hace que siempre se ejecute lo que hay despues del if.


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 15:48 pm
Ya he encontrado el fallo.

Código
  1. if(strcmp(pass, tmp) == 0);
  2.   {
  3.       printf("\nAcceso Exitoso\n");
  4.       return;
  5.   }

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


Título: Re: Ayuda con Archivos
Publicado por: 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


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 16:44 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.


Título: Re: Ayuda con Archivos
Publicado por: 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


Título: Re: Ayuda con Archivos
Publicado por: 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.


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 17:29 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


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 17:30 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


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 17:38 pm
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 );
}


Título: Re: Ayuda con Archivos
Publicado por: 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:

Código
  1. void opcion1()
  2. {
  3.   FILE *p;
  4.   p = fopen("accesobanco.txt", "w");
  5.   fprintf(p, "%s, %s","useras34", "ae78\n");
  6.   fprintf(p, "%s, %s","\nuseras32", "ui99\n");
  7.   fprintf(p, "%s, %s","\nuseras45", "eo76\n");
  8.   fprintf(p, "%s, %s","\nuserasg6", "ie44\n\n");
  9.   fclose ( p );
  10. }
  11.  


Título: Re: Ayuda con Archivos
Publicado por: 0xDani en 4 Febrero 2013, 18:32 pm
"w++" no es ningun modo de apertura valido para fopen(), supongo que sera "w+".


Título: Re: Ayuda con Archivos
Publicado por: jscrip en 4 Febrero 2013, 18:40 pm
Me parece que el formato que le estás dando a tu archivo no es el correcto, prueba con esto:

Código
  1. void opcion1()
  2. {
  3.   FILE *p;
  4.   p = fopen("accesobanco.txt", "w");
  5.   fprintf(p, "%s, %s","useras34", "ae78\n");
  6.   fprintf(p, "%s, %s","\nuseras32", "ui99\n");
  7.   fprintf(p, "%s, %s","\nuseras45", "eo76\n");
  8.   fprintf(p, "%s, %s","\nuserasg6", "ie44\n\n");
  9.   fclose ( p );
  10. }
  11.  
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.