C/Visual C - Malditos ficheros...

 
Vista:

Malditos ficheros...

Publicado por BluSky (11 intervenciones) el 20/08/2003 21:26:21
He trabajado con ficheros un montón de veces pero ahora me surge un problema que no veo dónde puede estar. Os comento:
Genero a partir de un fichero de texto, otro binario basado en una estructura. El código es éste:
void copiar(struct elemento *v,int pos)
{
int i;
i = 0;
FILE *fsal;
fsal = fopen("salida.bin","w");
while (i < pos){
fwrite(&v[i],sizeof(struct elemento),1,fsal);
i++;
}
fclose(fsal);
}
He comprobado con "printf" que los datos que guarda son (aparentemente correctos. También, si lo miro con el bloc de notas, parece que está todo guardado. Pero he hecho un programilla que lo lea y me muestra sólo el primero...ahí va el código:
void leer()
{
int i;
FILE *fp;
struct elemento e;
printf ("Fichero de salida\n");
fp=fopen("salida.bin","r");
while (!feof(fp)) {
fread(&e, sizeof (struct elemento), 1, fp);
puts (e.nombre);
}
fclose(fp);
}
¿Observais algun error?
Saludos
Sebas
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

unas comentarios

Publicado por s (3 intervenciones) el 20/08/2003 23:24:19
Hola.
Primero fijate que la funcion
" fread(&e, sizeof (struct elemento), 1, fp); " no falle. A mi me ha pasado que en ciertos programas y compiladores esta función falla cuando trato de leer mas de dos bytes en bloque. Si te pasa eso, trata de leer solamente byte por byte hasta llenar la estructura que necesitas.

También no se si sepas que hay un detalle al guardar las estructuras a disco duro. El detalle consiste en que dependiendo del compilador, puede agregar bytes de relleno a tu estructura. Por ejemplo, la estructura

struct Ejemplo{
int unEntero;
char unaCadena[5];
}

puede ocupar, dependiendo del relleno, los (4 + 5) bytes, o tal vez (4 + 5 + 3) donde los 3 bytes agregados son de relleno(por cuestiones de alineacion y desempeño), por lo que podrías tal vez estar leyendo más o menos bytes de los que necesitas.

Por último, corrige lo siguiente:
fsal = fopen("salida.bin","w"); por fsal = fopen("salida.bin","wb");
y
fp=fopen("salida.bin","r"); por fp=fopen("salida.bin","rb");

es decir, guarda y abre los archivos explcitamente como binarios(de ahí la 'b')

Espero que te sirvan de algo mis comentarios

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:unas comentarios

Publicado por BluSky (11 intervenciones) el 21/08/2003 14:43:04
Pues claro que me vale nolouses:-))
Efectivamente ese era el problema... no había caído en el detalle del "b" de binario. Había hecho pruebas con estructuras más simples y funcionaba perfectamente (sin la "b"); por eso andaba completamente despistado.
Una curiosidad: ¿por qué al leer sale el último repetido?. Se supone que cuando llega al final (eof) debería para el bucle ¿no?
Saludos y gracias de nuevo
Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:unas comentarios

Publicado por chuidiang (677 intervenciones) el 22/08/2003 09:47:06
El feof() no se hace true hasta que haces un fread() después del fin de fichero. Si lees el último elemento, feof() todavia es false. Cuando intentas leer el siguiente al ultimo (que no existe) es cuando feof() se vuelve true.

Una forma correcta de hacer el bucle es la siguiente:

fopen ()
fread();
while (!feof())
{
/* Tratar aqui los datos leidos */
...

fread()
}

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar