Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/04/2015, 01:38
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Posicionarse en el registro inicial después de una búsqueda [C]

El programa crea un archivo(sobreescribiendo el anterior) con 5 registros para que posteriormente podemos buscar en el una palabra, esa es su función.

luego pido una palabra en ingles para buscar en el registro. Si abres el archivo verás que hay el contenido de t dentro del archivo.

obtengo el numero de bytes del registro con ftell ( ptrFile ) / sizeof ( Traductor ); y lo guardo en nRegistros. Viene explicado aquí: www.c.conclase.net/ficheros/?cap=004#inicio en la parte que pone "Calcular la longitud de un fichero".

La función ftell(fichero); me va decir cuantos Bytes hay en el fichero, cada registro tiene un tamaño de 61Bytes ya que has reservado 2 variables con 30 chars y una con un char que da en un total 61 Bytes por registro, todos tienen ese tamaño independientemente de si ocupas o no el tamaño completo ya que no se escribe en el pero si abres el archivo puedes apreciar que hay una separación entre las palabras muy grande.

Lo que hay en el archivo es lo que hay en t, 5 registros de 61 bytes cada o sea 5*sizeof(Traductor). ;)

Volviendo a ftell ( ptrFile )... Si ftell nos da el tamaño total en Bytes de 5 registros que sabemos que hemos puesto en el fichero el calculo seria ftell ( ptrFile ) / sizeof ( Traductor );, ese seria el numero de registros nRegistros. Podia poner directamente nRegistros = 5 ya que se que tiene un tamaño de 5. ¿Pero y en los casos que no se el tamaño? XD

Ahora que tenemos nRegistros entramos en el bucle de búsqueda. La magia esta en el contador puesto que a cada lectura con fread ( &temp, sizeof ( Traductor ), 1, ptrFile ) avanzamos un registro, si se encuentra lo que buscamos entramos en el primer if de ese bucle y lo frenamos para que no cuente más, yo le he cambiado la palabra en ingles por "CAMBIADO!INGLES" tu puedes tomar un valor por teclado para cambiar si quieres. XD

Ahora bien, ni siempre la palabra va existir en el fichero. ¿Si sabemos que nuestro fichero tiene 5 registros y no hemos encontrado a la palabra, es que la palabra no existe verdad? Para eso esta el segundo if, que averigua si el contador se puso a la par con nRegistros, lo que quiere decir que en el registro no le queda palabras por buscar y que a consecuencia no se encuentra tu palabra.

Si la palabra existe vas a verla cambiada por "CAMBIADO!INGLES" si no seguirá tal cual.

Ya no hay nada que explicar, el programa es muy sencillo, quitando los avisos que has dicho %ld todo ok XD

por si a la criatura esta no la conoces scanf ( "%29[^\n]%*c", buscado ); Te explico lo que hace. Lee 29 chars máximo hasta encontrar el enter, leyendo también espacios, tabuladores etc, evitando que entre enter en la cadena, y finalizando la con un '\0' al final. Si entras mas de 29 chars, el restante permanece en el buffer, entonces deberías limpiarlo.

Espero no haberte liado más jajaja

Suerte!