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

[SOLUCIONADO] Problemas con fseek y ftell

Estas en el tema de Problemas con fseek y ftell en el foro de C/C++ en Foros del Web. Hola a todos, soy nuevo en el foro y tengo una duda que necesito resolver urgente para un trabajo practico. Se trata de programacion en ...
  #1 (permalink)  
Antiguo 06/11/2014, 21:04
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 10 años
Puntos: 0
Pregunta Problemas con fseek y ftell

Hola a todos, soy nuevo en el foro y tengo una duda que necesito resolver urgente para un trabajo practico. Se trata de programacion en C y es un programa pequeño en el que quiero contar la cantidad de registros que tiene un archivo binario "postulantes.bnn"

Este es el codigo

Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
	char ApellidoyNombre[50];
	char Sexo;
	unsigned long DNI;
	float PretensionSalarial;
}CONSULTORA;
void CuentaElementos (FILE *Archivo){
	CONSULTORA Aux;
	long int Final;
	int TotalDatos;
	fseek(Archivo,0,SEEK_END);
	Final=ftell(Archivo); // ACA FTELL ME RETORNA CERO
	TotalDatos=(sizeof(Aux))/Final; // Y ACA OBVIAMENTE ME PRODUCE EL ERROR AL            NO PODER DIVIR POR CERO 
	printf ("%d",TotalDatos);
	rewind(Archivo);
}
int main() {
	FILE *Archivo;
	CONSULTORA *C;
	Archivo = fopen ("postulantes.bnn","wb+");
	if (Archivo==NULL){
		printf("Ha ocurrido un error. El archivo no se puede abrir ");
		exit(1);
	} else printf("El archivo se abrio correctamente \r\n");
	CuentaElementos(Archivo);
	fclose(Archivo);
	return 0;
}
  #2 (permalink)  
Antiguo 07/11/2014, 01:13
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problemas con fseek y ftell

El problema que tienes es que, tal y como reza la especificación, el comportamiento de "fseek(file, x, SEEK_END)" es indeterminado en el caso de ficheros binarios. Esto se debe a la aparición de caracteres nulos que pueden hacer inviable encontrar el final del buffer... en consecuencia, cualquier desplazamiento relativo al final del fichero da un resultado indeterminado.

Para conocer el tamaño del fichero deberías echar un vistazo a fstat():

* fstat en Windows
* fstat en Linux

Un saludo.
  #3 (permalink)  
Antiguo 07/11/2014, 05:13
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 10 años
Puntos: 0
Respuesta: Problemas con fseek y ftell

Hola eferion muchas gracias a tu respuesta. La verdad que no me sale muy bien la funcion que citaste me darias un ejemplo? Muchas gracias
  #4 (permalink)  
Antiguo 07/11/2014, 05:44
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Problemas con fseek y ftell

El prototipo de la función es

Código C++:
Ver original
  1. int _fstat( int handle, struct _stat *buffer );

es decir, tienes que pasarle el descriptor del archivo que has abierto y una referencia a una estructura de tipo "struct _stat", "struct stat" si es en linux. La función finalmente te devolverá un entero que indica si se ha producido algún error y, en caso contrario, rellena la citada estructura.

La estructura stat contiene la siguiente información:

Código C++:
Ver original
  1. dev_t     st_dev     Device ID of device containing file.
  2. ino_t     st_ino     File serial number.
  3. mode_t    st_mode    Mode of file (see below).
  4. nlink_t   st_nlink   Number of hard links to the file.
  5. uid_t     st_uid     User ID of file.
  6. gid_t     st_gid     Group ID of file.
  7. off_t     st_size    For regular files, the file size in bytes.
  8.                      For symbolic links, the length in bytes of the
  9.                      pathname contained in the symbolic link.
  10.                      For other file types, the use of this field is
  11.                      unspecified.
  12. time_t    st_atime   Time of last access.
  13. time_t    st_mtime   Time of last data modification.
  14. time_t    st_ctime   Time of last status change.

Es decir, el campo st_size te va a indicar el tamaño en bytes del fichero.

Son tres líneas de código, hacer la llamada, comprobar que no se ha producido ningún error y consultar el campo st_size para saber el tamaño en bytes del fichero.
  #5 (permalink)  
Antiguo 07/11/2014, 17:41
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problemas con fseek y ftell

Comentario: además de que no se recomienda usar fseek para determinar el tamaño de un archivo "binario", el problema particular de este caso es que lo abres con
Código:
Archivo = fopen ("postulantes.bnn","wb+");  // mode w+
"w+" -> write/update: Create an empty file and open it for update (both for input and output). If a file with the same name already exists its contents are discarded and the file is treated as a new empty file.

Esto es: crea un archivo vacío y, si uno con el mismo nombre ya existiera, se descarta su contenido y se trata como uno nuevo vacío.

Eso explica por qué siempre Final es 0, porque tu archivo está vacío.

:lareto :)
  #6 (permalink)  
Antiguo 09/11/2014, 15:51
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 10 años
Puntos: 0
Respuesta: Problemas con fseek y ftell

Muchas Gracias por su ayuda!!!!

Etiquetas: files
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 10:09.