Ver Mensaje Individual
  #5 (permalink)  
Antiguo 04/04/2015, 02:13
ecfisa
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Posicionarse en el registro inicial después de una búsqueda [C]

Hola rdv316.

Otro ejemplo con una función que te permite buscar una palabra en ambos idiomas:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define SPA 'e'
  7. #define ENG 'i'
  8.  
  9. typedef struct {
  10.     char marcado;
  11.     char ingles[30];
  12.     char espaniol[30];
  13. } Traductor;
  14.  
  15. // Busca palabras en archivo
  16. long int searchWord( FILE* fp, char* word, char lang );
  17.  
  18. int main( ) {
  19.   FILE *fp;
  20.   Traductor tr;
  21.   char lang, str[30];
  22.   long int position;
  23.  
  24.   if( ( fp = fopen ( "traductor.dat", "rb+" ) ) == NULL ) {
  25.     perror( "Error" );
  26.     return EXIT_FAILURE;
  27.   }
  28.   // datos
  29.   strcpy( str, "window" );  // palabra buscada
  30.   lang = ENG; // idioma (tendrías que filtrar la entrada a: SPA o ENG)
  31.   position = searchWord ( fp, str, lang );  // buscar
  32.   // posicionarse en palabra buscada y mostrar
  33.   if ( position != -1 ) {
  34.     fseek ( fp, position - sizeof(tr)  , SEEK_SET );
  35.     fread ( &tr, sizeof(tr), 1, fp);
  36.     printf ( "%c %s %s\n\n", tr.marcado, tr.espaniol, tr.ingles );
  37.   } else
  38.     printf ( "Palabra no encontrada" );
  39.   fclose ( fp );
  40.   return EXIT_SUCCESS;
  41. }
  42.  
  43. /* Busca en el archivo una palabra en inglés o español ( preserva posición )
  44.    Parámetros: puntero al archivo, palabra a buscar, idioma
  45.    Devuelve: la posición en el archivo o -1 si no existe */
  46. long int searchWord( FILE* fp, char* word, char lang ) {
  47.   Traductor tr;
  48.   long int mark, pos;
  49.   lang = tolower(lang);
  50.  
  51.   // guardar posición actual
  52.   mark = ftell ( fp );
  53.   // posicionar al inicio
  54.   rewind ( fp );
  55.   // buscar
  56.   if (lang == 'e' ) {
  57.     while ( fread ( &tr, sizeof ( tr ), 1, fp ) && strcmp ( tr.espaniol, word ) );
  58.     pos = ( strcmp ( tr.espaniol, word ) == 0 ) ? ftell ( fp ) : -1;
  59.   } else {
  60.     while ( fread ( &tr, sizeof ( tr ), 1, fp ) && strcmp ( tr.ingles, word ) );
  61.     pos = ( strcmp ( tr.ingles, word ) == 0 ) ? ftell ( fp ) : -1;
  62.   }
  63.   // restaurar posición previa
  64.   fseek ( fp, mark, SEEK_SET );
  65.   // resultado
  66.   return pos;
  67. }

Saludos.

Última edición por ecfisa; 04/04/2015 a las 02:32