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
const int MAX=32;
typedef char tcad[MAX];
typedef FILE *archivo;
typedef struct usuario{
tcad nombre;
tcad apellido;
int edad;
...
};
void registrar_usuario_nuevo(archivo usuarios_de_facebook)
{
usuario nuevo;
usuarios_de_facebook=fopen("usuarios","ab+");
fflush(stdin);
cout<<"Ingrese nombre de usuario: ";
gets(nuevo.nombre);
fflush(stdin);
...
fclose(usuarios_de_facebook);
if(consultar_usuario(usuarios_de_facebook,nuevo.nombre)==false){
usuarios_de_facebook=fopen("usuarios.txt","ab");
fwrite(&nuevo,sizeof(nuevo),1,usuarios_de_facebook);
}
else
cout<<"Ya existe un usuario con ese nombre"<<endl;
fclose(usuarios_de_facebook);
}
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.
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
Bueno si, perdonen, aca dejo la funcion que vereifica si el nuevo usuario ya existe
bool consultar_usuario(archivo usuarios_de_facebook,tcad usuario_buscado)
{
usuario extraido;
bool encontrado=false;
usuarios_de_facebook=fopen("usuarios.txt","rb");
if(usuarios_de_facebook!=NULL){
while(!feof(usuarios_de_facebook) && !encontrado){
fread(&usuarios_de_facebook,sizeof(extraido),1,usuarios_de_facebook);
if(!feof(usuarios_de_facebook) && strcmp(extraido.nombre,usuario_buscado)==0)
encontrado=true;
}
}
fclose(usuarios_de_facebook);
return encontrado;
}
Estás cerrando el archivo 3 veces, parece.
2 para ser mas exactos pero se puede hacer eso o no? Porque la verdad me funciona igual ;-)
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.
Haa no si 3, bueno hoy resolvere eso >:D
Problema resolvido :laugh:
Y lo resolvi sola, pense que alguien de aca me ayudaria pero se ve que no >:D
void registrar_usuario_nuevo(archivo usuarios_de_facebook)
{
usuario nuevo;
usuarios_de_facebook=fopen("usuarios","ab+");
fflush(stdin);
cout<<"Ingrese nombre de usuario: ";
gets(nuevo.nombre);
fflush(stdin);
...
fclose(usuarios_de_facebook);
if(consultar_usuario(usuarios_de_facebook,nuevo.nombre)==false){
usuarios_de_facebook=fopen("usuarios.txt","ab");
fwrite(&nuevo,sizeof(nuevo),1,usuarios_de_facebook);
fclose(usuarios_de_facebook);
}
else
cout<<"Ya existe un usuario con ese nombre"<<endl;
}
Cita de: 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.
Es que hay que cerrarlo si vas a llamar a otro metodo que te hace una busqueda secuencial en el mismo bebe, saludos :laugh:
Si haces
i = 3;
e inmediatamente despues haces
i = 5;
que crees que pasa con el 3?
Si en un programa tuvieras esto:
i = 3;
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.
void f(int i) {
i = 5;
}
int main() {
f( 3 );
// ...
}
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.
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
CitarEs 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...