[C con Clase] Método de la burbuja (era: problemas con la posicion del puntero en un fichero, funciones fread, frwite, fseek etc.)

Albert Montolio albert.montolio en gmail.com
Dom Mar 18 13:32:14 CET 2012


>
> Hola, tengo problemas con abrir archivos, variables booleanas y las
>> condiciones de los whiles.
>>
> Tengo una estructura que se llama palabra, que contiene palabra en
castellano, su traduccion, y quiero ponerle una etiqueta (animales,
deportes etc,)
en un archivo (datos.dat) se guardaran las palabras, en otro archivo se
guardaran las etiquetas (etiquetas.dat)
cuando el usuario introduce 1 palabra a guardar, quiero comprobar si la
etiqueta que introduce ya existia o no, i si la palabra que introduce ya
existia o no, mediante variables booleanas y whiles. He escrito el codigo
fuente pero hay errores que nose encontrar, ya que el comportamiento es
caotico, no me abre el archivo en la primera entrada de palabra. creo que
por ahi esta el problema, xo nose resolverlo. Creo que mi codigo fuente
deberia funcionar para todas las iteraciones excepto la primera, que nose
porque no funciona. Me sale que no ha podido abrir el archivo etiquetas en
la primera iteracion (logico, aun esta vacio), xo no entiendo xk no escribe
nada despues. Alguien me podria ayudar? indicarme si voy por el buen
camino, o esta muy mal, o donde puedo mejorarlo... estaría muy agradecido.


void introducir_entrada ()

{

printf("\n Ha elegido la opcion: Introducir entrada.\n");

struct t_palabra {
       char castellano[80];
       char aleman[80];
       float cont_aciertos;
       float cont_errores;
       float eff;
       char etiqueta[20];
       char tipo[20];
       char fecha[20];
       };

struct t_etiqueta {
       char cadetiqueta[20];
       };

    FILE *fichero; // contiene todas las palabras
    FILE *fichero2; // contiene todas las etiquetas (solo 1 vez)
    struct t_palabra palabra_nueva;
    struct t_palabra palabra;
    struct t_etiqueta etiqueta;
    int n,i;
    bool encontrada; // indica si ha encontrado la palabra, entonces no la
vuelve a escribir)
    time_t tiempo = time(0);
    struct tm *tlocal = localtime(&tiempo);
    char output[128];
    bool etiquetaencontrada; // indica si ha encontrado la etiqueta,
entonces no la vuelve a escribir


// Primero mostrar etiquetas disponibles, para que el usuario decida si
utiliza alguna o no

printf ("\n\nEtiquetas disponibles: ");

fichero2 = fopen ("etiquetas.dat", "rb+");

if (fichero2 == NULL)
{
printf ("Error: Aun no has introducido ninguna etiqueta en el fichero
etiquetas.dat.");
}
else
    {
    fread(&etiqueta, sizeof(etiqueta), 1, fichero2);
    while (feof(fichero2)==0)
          {
          printf ("\n%s", etiqueta.cadetiqueta);
          fread(&etiqueta, sizeof(etiqueta), 1, fichero2);
          }
                fclose (fichero2);
    }

// se han escrito todas las etiquetas previamente introducidas. en el
primer caso no se escribe ninguna
// el usuario introduce su palabra, con su correspondiente etiqueta

fflush(stdin);
printf ("\n\nCastellano: ");
gets (palabra_nueva.castellano);
fflush(stdin);
printf ("\n\nIngles: ");
gets (palabra_nueva.aleman);
printf ("\n\nTipo: ");
gets (palabra_nueva.tipo);
printf ("\n\nEtiqueta: ");
gets (palabra_nueva.etiqueta);
// una vez introducida la palabra, con su etiqueta, se busca la etiqueta en
el fichero etiquetas, xa ver si ya existia o no

            // encontrar etiqueta

fichero2 = fopen ("etiquetas.dat", "rb+");
etiquetaencontrada = false;
if (fichero2 == NULL)
{
printf ("Error: No se ha podido abrir el fichero etiquetas.dat.");
}
else
    {
    i=0;
    fseek(fichero2, 0*sizeof(etiqueta), SEEK_SET);
    etiquetaencontrada = false;
    while (etiquetaencontrada == false)           // se busca si ya existia
la etiqueta, sino existia se introduce, sino, nada
    //while (!feof(fichero))
            {
            fseek(fichero2, i*sizeof(etiqueta), SEEK_SET);
            fread(&etiqueta, sizeof(etiqueta), 1, fichero2);

                            if (strcmp(palabra_nueva.etiqueta,
etiqueta.cadetiqueta)==0)
                            {
                            etiquetaencontrada == true;
                            }
                            else
                            {
                            //encontrada = false;
                            }
                             i++;

            }                            // una vez recorrido el
etiquetas.dat, si la hemos encontrado, nada, sino la hemos encontrado,
escribimos
                             if (etiquetaencontrada == false)
                             {
                             strcpy (etiqueta.cadetiqueta,
palabra_nueva.etiqueta);
                             fwrite (&etiqueta, sizeof(etiqueta), 1,
fichero2);
                             }

                             else
                             {
                             }
    fclose (fichero);
    }



            //} INTRODUCIR PALABRA en el archivo dats.dat

fichero = fopen ("datos.dat", "ab+");

if (fichero == NULL)
{
printf ("Error: No se ha podido abrir el fichero datos.dat.");
}

else

{

            palabra_nueva.cont_aciertos = 0;
            palabra_nueva.cont_errores = 0;
            palabra_nueva.eff = 0;

            strftime(output,128,"%d/%m/%y %H:%M:%S",tlocal);

            printf("\n\n\n%s\n",output);

            strcpy (palabra_nueva.fecha, output);


            // COMPROBAR SI YA LA HABIAS ENTRADO
            i=0;
            fseek(fichero, 0*sizeof(palabra), SEEK_SET);
            encontrada = false;
            while (!feof(fichero))
            {
                  fseek(fichero, i*sizeof(palabra), SEEK_SET);
                  fread(&palabra, sizeof(palabra), 1, fichero);
                                  if (strcmp(palabra_nueva.castellano,
palabra.castellano)==0)
                                  {
                                  encontrada = true;
                                  }
                                  else
                                  {
                                  //encontrada = false;
                                  }
                  i++;
            }



              if (encontrada==true)
                 {
                 printf ("\n\nYa la habias escrito ");
                 }
              else
                   {
                   fwrite (&palabra_nueva, sizeof(palabra_nueva), 1,
fichero);
                   }

}

fclose (fichero);



fflush(stdin);
printf("\n\nPulse Intro para finalizar...");
getchar();

}

>
>> --
>> Salvador Pozo (Administrador)
>> mailto:salvador en conclase.net
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120318/52ed139c/attachment.html>


Más información sobre la lista de distribución Cconclase