Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 21 Noviembre 2018, 18:40 pm



Título: Archivos
Publicado por: Beginner Web en 21 Noviembre 2018, 18:40 pm
Hola queria saber si es viable esta forma de cerrar dos veces el archivo, esto funciona 100% pero a mi no me gusta como queda, saludos
Código
  1. const int MAX=32;
  2. typedef char tcad[MAX];
  3. typedef FILE *archivo;
  4. typedef struct usuario{
  5. tcad nombre;
  6. tcad apellido;
  7. int edad;
  8. ...
  9. };
  10.  
  11. void registrar_usuario_nuevo(archivo usuarios_de_facebook)
  12. {
  13. usuario nuevo;
  14. usuarios_de_facebook=fopen("usuarios","ab+");
  15. fflush(stdin);
  16. cout<<"Ingrese nombre de usuario: ";
  17. gets(nuevo.nombre);
  18. fflush(stdin);
  19. ...
  20. fclose(usuarios_de_facebook);
  21. if(consultar_usuario(usuarios_de_facebook,nuevo.nombre)==false){
  22. usuarios_de_facebook=fopen("usuarios.txt","ab");
  23. fwrite(&nuevo,sizeof(nuevo),1,usuarios_de_facebook);
  24. }
  25. else
  26. cout<<"Ya existe un usuario con ese nombre"<<endl;
  27. fclose(usuarios_de_facebook);
  28. }


Título: Re: Archivos
Publicado por: CalgaryCorpus en 21 Noviembre 2018, 18:52 pm
Si cierras el archivo justo antes de llamar a la funcion consultar_usuario, que al parecer usa su contenido, no deberia poder acceder a la informacion contenida en el.


Título: Re: Archivos
Publicado por: srWhiteSkull en 21 Noviembre 2018, 18:53 pm
En teoría deberías meter ese fclose() al final en la condición final y no fuera. Incluso si prescindes del cierre al final funcionaría, y dependiendo de si el fichero está cerrado o no la función obra y retorna un valor que si quieres podrías comprobarlo con fines depurativos  ;D

https://en.cppreference.com/w/cpp/io/c/fclose


Título: Re: Archivos
Publicado por: Beginner Web en 21 Noviembre 2018, 23:40 pm
Bueno si, perdonen, aca dejo la funcion que vereifica si el nuevo usuario ya existe
Código
  1. bool consultar_usuario(archivo usuarios_de_facebook,tcad usuario_buscado)
  2. {
  3. usuario extraido;
  4. bool encontrado=false;
  5. usuarios_de_facebook=fopen("usuarios.txt","rb");
  6. if(usuarios_de_facebook!=NULL){
  7. while(!feof(usuarios_de_facebook) && !encontrado){
  8. fread(&usuarios_de_facebook,sizeof(extraido),1,usuarios_de_facebook);
  9. if(!feof(usuarios_de_facebook) && strcmp(extraido.nombre,usuario_buscado)==0)
  10. encontrado=true;
  11. }
  12. }
  13. fclose(usuarios_de_facebook);
  14. return encontrado;
  15. }


Título: Re: Archivos
Publicado por: CalgaryCorpus en 22 Noviembre 2018, 02:29 am
Estás cerrando el archivo 3 veces, parece.


Título: Re: Archivos
Publicado por: Beginner Web en 22 Noviembre 2018, 04:49 am
2 para ser mas exactos pero se puede hacer eso o no? Porque la verdad me funciona igual  ;-)


Título: Re: Archivos
Publicado por: CalgaryCorpus en 22 Noviembre 2018, 05:27 am
3 fclose: registrar_usuario_nuevo tiene 2 fclose e invoca a consultar_usuario que tiene otro fclose.

No cierres el archivo si lo vas a usar otra vez.


Título: Re: Archivos
Publicado por: Beginner Web en 22 Noviembre 2018, 15:18 pm
Haa no si 3, bueno hoy resolvere eso  >:D


Título: Re: Archivos
Publicado por: Beginner Web en 22 Noviembre 2018, 21:34 pm
Problema resolvido  :laugh:
Y lo resolvi sola, pense que alguien de aca me ayudaria pero se ve que no  >:D
Código
  1. void registrar_usuario_nuevo(archivo usuarios_de_facebook)
  2. {
  3. usuario nuevo;
  4. usuarios_de_facebook=fopen("usuarios","ab+");
  5. fflush(stdin);
  6. cout<<"Ingrese nombre de usuario: ";
  7. gets(nuevo.nombre);
  8. fflush(stdin);
  9. ...
  10. fclose(usuarios_de_facebook);
  11. if(consultar_usuario(usuarios_de_facebook,nuevo.nombre)==false){
  12. usuarios_de_facebook=fopen("usuarios.txt","ab");
  13. fwrite(&nuevo,sizeof(nuevo),1,usuarios_de_facebook);
  14.                fclose(usuarios_de_facebook);
  15. }
  16. else
  17. cout<<"Ya existe un usuario con ese nombre"<<endl;
  18. }


Título: Re: Archivos
Publicado por: Beginner Web en 22 Noviembre 2018, 21:41 pm
3 fclose: registrar_usuario_nuevo tiene 2 fclose e invoca a consultar_usuario que tiene otro fclose.

No cierres el archivo si lo vas a usar otra vez.
Es que hay que cerrarlo si vas a llamar a otro metodo que te hace una busqueda secuencial en el mismo bebe, saludos :laugh:


Título: Re: Archivos
Publicado por: CalgaryCorpus en 22 Noviembre 2018, 22:10 pm
Si haces

Código
  1.       i = 3;

e inmediatamente despues haces

Código
  1.       i = 5;

que crees que pasa con el 3?

Si en un programa tuvieras esto:

Código
  1.       i = 3;
  2.       i = 5;

la primera linea seria completamente superflua, podrias eliminarla y el programa funcionaria igual.

Esto que parece obvio se puede ocultar en el paso de parametros de una funcion.

Código
  1. void f(int i) {
  2.     i = 5;
  3. }
  4.  
  5. int main() {
  6.    f( 3 );
  7. // ...
  8. }

Es lo mismo anterior, pero usando el paso de parametros. A i se le asigna 3 y luego se le asigna 5, no se usa el valor 3, se sobreescribe con el 5 posterior.

No tiene sentido invocar f(3), si lo primero que se hace en f es ignorar lo que se pasa y usar un valor distinto.

Eso estas haciendo en tus funciones que pasan como parametro una referencia a un archivo (cerrado,  o no), y que lo primero que hace es reasignar la referencia a algo mas.

Tu programa funcionaria igual sin poner ni pasar ese parametro, si lo pasas, no cierres el archivo, si lo cierras antes, no lo pases.

En tu caso, parece que lo que corresponde es la primera opcion.


Título: Re: Archivos
Publicado por: Beginner Web en 23 Noviembre 2018, 00:51 am
Mmmm no entendi pero me funciona de maravilla, si te pasara el programa de 600 lineas te daria cuenta lo que tengo que hacer,  me falta corregir un par de modulos, cuando lo tenga terminado al programa te mando un privado y le hechas un ojo :D


Título: Re: Archivos
Publicado por: Serapis en 25 Noviembre 2018, 01:31 am
Citar
Es que hay que cerrarlo si vas a llamar a otro metodo que te hace una busqueda secuencial en el mismo bebe, saludos
No necesariamente. Basta que cambies el puntero al punto deseado, habitualmente al comienzo del fichero.

Piensa que a veces es más útil utilizar varios canales para un mismo fichero, que saltar entre punteros o que andar cerrando y abriendo el mismo fichero...