Se pueden combinar fwrite y fputs?

Started by gecko, February 21, 2012, 02:53:04 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

gecko

Hola!

Bueno, resulta que estoy intentando hacer un programa que guarde en el disco datos generados dinamicamente. Tengo datos de distinto tipo (INTs, arrays de BYTES de tamaño dinamico, y STRINGs)

Lo que hice hasta ahora es guardar primero los ints y los arrays dinamicos (posicion a posicion) con FWRITE()... y luego los strings con FPUTS()

EL PROBLEMA:

Si lo guardo en el orden comentado mas arriba funciona todo perfecto... ahora si primero guardo los STRINGS con FPUTS() y a continuacion los demas datos con FWRITE(), cuado quiero leerlos el programa se bloquea y se cierra.

LA PREGUNTA:

Hay alguna limitacion que tenga que tener en cuenta al escribir y leer archivos de esta forma? Se puede hacer todo con FWRITE()? Incluso los strings? Estoy haciendo todo mal y de forma poco estable?
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

se pueden guardar strings con FWRITE? tengo que leerlos de alguna forma especial?

perdon que pregunto todo, pero es que ya tengo la cabeza quemada de hacer pruebas y pruebas extrañas sin encontrar por que a veces falla y a veces no.
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

si, podes guardar el tamaño con un entero y luego guardar los bytes de la string.

tambien podes leer hasta que encuentres un '\0' (obviamente lo tenes que guardar para finalizar la string)

lo mejor es guardar el tamano previamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Si que puedes, pero has de utilizar "la otra manera", me explico:
*************************
fwrite tiene dos maneras de llamarse, (wiki):

INT fwrite ( <INT filehandle> , <VARIABLE data> )
INT fwrite ( <VOID POINTER data_pos> , <INT length> , <INT filehandle>)
Writes the variable data to a file loaded with fopen.

y esta otra función también la necesitarás:

INT len ( <STRING str> )
Returns the length, the number of characters, of a certain string.

***************

la segunda manera es la que te interesa, y para hacerlo por ejemplo:


int tamano, fichero;
string cadena;
...
cadena = "HELLO WORLD";
tamano = len (cadena);
...
fichero = fopen("RUTA_Y_NOMBRE_DEL_FICHERO", O_WRITE);
fwrite(cadena, tamano, fichero); // o fwrite(&cadena, tamano, fichero);
...


De esa forma si debería funcionarte.
El problema de las strings, es que las carga el diablo :P.
****
Strings are a sort of character array, combining characters to form text. Because the length of a string is dynamic, adding them is done easily. Single and double quotes can be used to create strings.
****

Espero haberte sido de ayuda,

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

gecko

Perfecto, gracias por la ayuda.

Entonces guardo primero el tamaño del string, y luego el string en si.

Despues les cuento como me fue, gracias! :)
Torres Baldi Studio
http://torresbaldi.com

Rein (K´)ah Al-Ghul

mas bien podrias evitarte esa variable

INT fwrite ( <VOID POINTER data_pos> , <INT length> , <INT filehandle>)
+
INT len ( <STRING str> )
=
INT fwrite ( <VOID POINTER data_pos> , len ( <STRING str> )  , <INT filehandle>)

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

a ver... el problema no es guardar la variable string, sino recuperarla luego.

si no sabes cuanto guardaste, no podes saber cuanto leer.

por eso tenes que guardar la len antes.

pero me olvide que esto ya esta soportado...

con hacer simplemente...

fwrite( handle, variable_string );

y luego para leerla

fread( handle, variable_string );

ya es suficiente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

en realidad, podes usar fwrite( handle, variable) y lo mismo fread, siendo variable cualquier variable, array, estructura.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2