Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ftell

Estas en el tema de ftell en el foro de C/C++ en Foros del Web. He ultizado en mi programa la función ftell: long int ftell(FILE *fichero); Mi problema es que no estoy segura de qué posición me está devolviendo ...
  #1 (permalink)  
Antiguo 28/12/2009, 06:16
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 7 meses
Puntos: 3
ftell

He ultizado en mi programa la función ftell:
long int ftell(FILE *fichero);

Mi problema es que no estoy segura de qué posición me está devolviendo exactamente. (ya se que es la posicion en la que se encuentra leyendo en el archivo...pero no es ese exactamente mi problema)

Esto es debido a que yo tengo declaradas dos estructuras:
  • Una se llama Respuestas (es una lista enlazada que contiene diversas respuestas con su id y su vector de respuestas...ademas de un número entero)
  • La otra es tipoPersonaje, que además de varios atrubutos de un personaje tales como el nombre, los apellidos...etc, cuenta con un atributo que es una lista enlazada de Respuestas (la estrcutura antes mencionada)

Cuando estoy cargando los datos desde el archivo binario en que se encuentran tengo el siguiente código:

Código C:
Ver original
  1. if(num)
  2.     {
  3.         ptr = fopen(nom_archivo, "rb");
  4.         for(i=0;i<num;i++)
  5.         {
  6.             fread((tipoPersonaje*)&personaje, sizeof(tipoPersonaje), 1, ptr);
  7.             pos = ftell(ptr);
  8.             cantidad = personaje.numResp;
  9.             //falla al asignar a personaje.answers la lista de respuestas extraida...
  10.             personaje.answers = *crearListaRespuestas(nom_archivo, pos, cantidad);
  11.             anyadirPersonaje(personajes, personaje);
  12.         }
  13.         fclose(ptr);
  14.     } // fin if _num

*NOTA: el if(num) viene de antes, solo he copiado el trozo de código que afecta directamente a mi problema.

cuando yo llamo a la función ftell...me devuelve la posición en la que está...¿¿Esto es antes de la lista enlaza de respuestas o despues?? (la lista enlazada de respuestas es el ultimo atributo de la clase tipoPersonaje)

Si la posición que me está mandando no es la de justo antes de la lista enlazada de respuestas (la cual recorro en crearListaRespuestas)...¿¿Habría alguna manera de saber dicha posición para podersela mandar manualmente?? Varía dependiendo de los campos del personaje q hayan sido rellenados?? (por ejemplo, si en nombre que lo tengo declarado con 40 caracteres solo he usado 4 caracteres...ocupa 4 o 40??) o es fijo con el numero de bytes declarados en la estructura??

Gracias un saludo
  #2 (permalink)  
Antiguo 28/12/2009, 10:06
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ftell

Ocupara lo que hayas escrito previamente, si usaste sizeof de una estructura para escribir entonces seran los 40 caracteres (si te queres mover usa fseek).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 28/12/2009, 10:14
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 7 meses
Puntos: 3
Respuesta: ftell

Entonces para esta estructura:

Código C:
Ver original
  1. struct sTipoPersonaje
  2. {
  3.     char nombre[40];
  4.     char apellidos[60];
  5.     char archivo[100]; //dirección del archivo con la imagen si es que se dispone de el
  6.     int numResp; //tomara el mismo valor qu el atributo num de la lista de respuestas
  7.     Respuestas answers;
  8. };
  9. typedef struct sTipoPersonaje tipoPersonaje;

habrá recorrido answers incluido...aunque no tenga los datos que se almacenan en dicha lista enlazada verdad??

Si quiero que el fseek empiece a leer en los la lista enlazada de respuestas le podria pasar como parámetro el valor 201 (en el caso del primero...)??? (40+60+100+1) ???
  #4 (permalink)  
Antiguo 28/12/2009, 10:23
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ftell

Seria 204 en todo caso (un entero son 4 bytes en x86), pero en realidad lo que tendrias que hacer es RETROCEDER el tamaño de Respuestas si queres leerlo ya que al haber leido con fread el tamaño total de la estructura (sizeof) te encontraras justo DESPUES de terminada la misma.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 28/12/2009, 10:29
Avatar de calathea  
Fecha de Ingreso: octubre-2008
Ubicación: Valladolid
Mensajes: 122
Antigüedad: 15 años, 7 meses
Puntos: 3
Respuesta: ftell

He probado...y te comento los resultados (antes no podía probar porque me saltaba una infraccion de acceso a una variable y no podía solucionarlo...)

Con 201 no me sale...con 204 tampoco...pero si lo mando tal cual indique en el primer código sí que me lo lee bien... :S
Parece ser que no recorre todo...se queda parado antes de recorrer la lista de respuestas... ¿a qué se debe?
  #6 (permalink)  
Antiguo 28/12/2009, 10:34
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: ftell

Dificil saberlo ... solo tenemos unos fragmentos de tu codigo, depuralo y abri el archivo con un editor hexadecimal al mismo tiempo, asi podras ver EXACTAMENTE que va haciendo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:24.