Hola, tengo que hacer un trabajo y estoy bastante perdido en esto de los ficheros, lo demas parece que ya lo voy controlando un poco mejor xD
bueno mi duda es:
si yo tengo una estructura de una persona (por ejemplo su nombre, direccion, edad,..)
en mi trabajo tengo que hacer que pueda guardarlo en un fichero.dat, y poder cargarlo cuando yo quiera, borrarlo, ver la lista, buscarlos por nombre.. etc, y la parte en la que mas me estoy atascando es en la de que todo eso lo guarde en el fichero que no se como hacerlo
alguien me puede ayudar?? o si alguien tuviese un ejercicio parecido que me sirviese de guia me ayuudaria mucho tambien
a otra cosa! xD viendo ejemplos tambien veo que en muchas ocasiones se usa gets en vez de scanf (que diferencia hay?) (tampoco se cuando se usa fprintf para los fucheros y esas cosas nada...por mas que leo me lio mas)
Saludos y gracias!
Para guardar una estructura
Para guardar una estructura simplemente abre el archivo con un puntero FILE:
FILE* fp = fopen( "fichero.dat", "wb+" );
Y escribela usando fwrite:
fwrite( &estructura, sizeof( DefinicionEstructura ), 1, fp );
Luego simplemente lo cierras con fclose y tirando.
Por ejemplo:
La diferencia entre gets y scanf es que gets recoge TODO lo que se escribe y lo devuelve en un char, scanf recibe la entrada y luego la lee para devolver cada valor en su variable correspondiente. La principal diferencia es que con scanf no puedes recibir cadenas con espacios.
fprintf es como printf, pero en vez de escribir en la pantalla redirige la salida hacia un archivo, por lo que podrás hacer algo como esto:
Cuando tengas alguna duda puedes consultar la referencia: http://www.cplusplus.com/reference/clibrary/ aunque es de C++ la clibrary es la referencia de las librerias de C por lo que te vale igualmente.
Una pequeña puntualización.
El código que te ha puesto AlmamuPP en general funciona bien, es eficiente y bastante elegante, pero tiene un pequeño problema. ¿Cual es el problema? Como siempre, los punteros.
Si tu estructura tiene algún puntero dentro (por ejemplo, si tu estructura tiene una cadena o vector dinámico), fwrite no te va a guardar el contenido del array, sino solo el puntero. Si lo guardas así, la próxima vez que leas el archivo, vas a coger un puntero que apunta a la antigua zona de memoria, que puede no estar reservada... Resumiendo, que al leer el archivo va a petar el programa. En ese caso, si tienes arrays o cadenas, inevitablemente vas a tener que guardar la estructura elemento a elemento. Sin embargo, si el vector es estático (por ejemplo un char nombre [50]) CREO que sí funcionaría, aunque no estoy totalmente seguro.
Lo dicho, que si solo tienes variables y vectores estáticos, no te afecta (creo, aunque habría que probarlo). Pero ten cuidado en el futuro con los punteros, que a veces están ahí aunque no los veas xD.
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
Oh, es verdad, se me olvidó
Oh, es verdad, se me olvidó sobre los punteros, xD. En principio, si no tienes punteros dentro de la estructura todo debe de funcionar correctamente.
Muchisimas gracias por
Muchisimas gracias por responder de tal manera, esta todo muy bien explicado! mañana pruebo haber si me sale eso
si no me equivoco con gets tu
si no me equivoco con gets tu solo pones el nombre del array ejemplo:
char nombre[10];
gets(nombre);
Es mucho mas facil que con scanf yo tambien estoy viendo esto de programar pero por mi cuenta suerte :D