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?
te conviene usar todo fwrite.
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.
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.
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 (http://wiki.bennugd.org/index.php?title=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 (http://wiki.bennugd.org/index.php?title=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!
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! :)
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>)
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.
en realidad, podes usar fwrite( handle, variable) y lo mismo fread, siendo variable cualquier variable, array, estructura.