[PROBLEMA] C++ y trabajo con ficheros

Buenas.

En clase estamos haciendo un programa que guarda en un fichero binario fichas de jugadores con su nombre, dni, etc. Ese programa primero lo hicimos con funciones y una array global. Luego con un puntero. Y ahora vamos a hacerlo guardando los datos en un archivo como he dicho. El tipo de estructura la declaro al inicio, fuera del main. Y fuera del main tambien, me declaro un puntero al archivo que guarda las fichas de los jugadores.

El problema es que no me guarda los cambios que hago en las fichas. Le doy a la funcion de listar todas las fichas que tiene guardadas (tiene un maximo de 15) y siempre me dice que esta vacia.

Al iniciar main, hago un fopen del fichero con "r+b", si no recuerdo mal. Y si me devuelve un NULL (el fichero no existe), hago un fopen pero con "w+b". Para diferenciar si una ficha esta vacia, marco el campo dorsal con un 99. Osea que si un jugador tiene en su ficha el dorsal 99, esa ficha esta en realidad vacia. Asi que si me devuelve un NULL el primer fopen, lo cual quiere decir que el archivo no existe, ejecuto el 2o ("w+b") y pongo las 15 fichas con el dorsal 99, para que asi esten todas vacias. Espero que lo haya explicado bien. El fclose lo hago al finalizar el main.

El problema es que cuando guardo una ficha nueva, me dice el programa que se ha guardado perfectamente. Pero cuando le doy a listar, me dice que todas estan vacias. En clase, ya a ultima hora, hemos probado a hacer un fopen cada vez que ejecutamos la funcion de guardar. Y antes de finalizar la funcion, un fclose. Asi parece que funcionaba bien. Al menos hemos creado una ficha y al listarla, la ha mostrado. Aunque no hemos probado mucho mas. Pero no se si seria muy correcto andar abriendo y cerrando el fichero cada vez que llamamos una funcion. Me imagino que lo mas optimo seria como lo tengo ahora, abrirlo al iniciar main, y cerrarlo al salir. Pero como digo, no funciona.

Alguien, con los datos que he dado, tiene idea de por que puede fallar?

Muchas gracias.
Inicias el programa, si no está el fichero, lo creas con w+b (lectura y escritura, binario) y escribes, después al listar no aparece nada. Antes de listar, ¿usas fflush, rewind, fseek o fsetpos para mover el cursor? Si no es así, te encuentras en el final del fichero.
fflush lo utilizo, si no recuerdo mal, antes de llamar a las funciones, y despues, antes de los return. Creo que era asi. Por que nos dio muchos problemas al principio. Asi que simplemente llene de fflush el codigo y a correr. xD

Ahora que lo dices, espero que no sea ese el problema.

Y si, fseek lo utilizo siempre al inicio de cada funcion. Limpio pantalla, fflush y fseek (fichero, 0, 0).

Editado:

Añado parte del codigo (no lo pongo todo, con esas 2 funciones ya se puede comprobar que no funciona):

http://pastebin.com/Mux83s8M
Vuelvo a subir esto. El hilo anterior lo edite y puse una parte del codigo para que vieseis lo que me falla. El programa tiene mas funciones, pero tal cual esta compila. Y el fallo como dije, es que supuestamente guarda bien las fichas de los jugadores en fichero. Peor no debe ser asi, por que luego al listar todas las fichas me dice que el fichero esta vacio.

Gracias de nuevo.
3 respuestas