Anuncios Google

Duda guardar en ficheros una estructura

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!

 



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Almamu

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:

typedef struct
{
	int age;
	bool sex;
}__USUARIO__;
 
int main()
{
	printf( "Creando usuario...\n" );
	__USUARIO__ user;
	user.age = 15;
	user.sex = false;
	FILE* fp = fopen( "fichero.dat", "wb+" );
 
	fwrite( &user, sizeof( __USUARIO__ ), 1, fp );
	fclose( fp );
}

 

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:

void WriteFile( const char* user, const char* surname )
{
	FILE* fp = fopen( "res.txt", "wb+" );
	fprintf( fp, "Tu nombre es: %s y tu apellido: %s", user, surname );
	fclose( fp );
}

 

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.


Imagen de joserc87

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.

 


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Almamu

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.


Imagen de ALCales

Muchisimas gracias por

Muchisimas gracias por responder de tal manera, esta todo muy bien explicado! mañana pruebo haber si me sale eso

Imagen de anxoganso

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


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.