[C con Clase] problemas con la posicion del puntero en un fichero, funciones fread, frwite, fseek etc.
Albert Montolio
albert.montolio en gmail.com
Dom Mar 11 15:24:14 CET 2012
Hola, alguien me podría ayudar con el metodo de la burbuja? lo quiero
aplicar a estructuras, xo tengo problemas con el final del archivo.
quiero ordenar un numero concreto de estructuras, que cada una contiene un
float, y las quiero ordenar por ese float.
Muchas gracias
aqui esta el ejemplo, considerando que hay 4 palabras escritas (xk dudo
mucho en el valor de jota)
#include <stdio.h>
#include <string.h>
struct t_palabra {
char castellano[40];
char aleman[40];
float cont_aciertos;
float cont_errores;
float eff;
};
int main (void)
{
FILE *fichero;
struct t_palabra palabra;
struct t_palabra temp;
char respuesta[40];
int i, j, nPalabras;
float virt1, virt2;
fichero = fopen ("datos.dat", "rb+");
if (fichero == NULL)
printf ("Error: No se ha podido abrir el fichero datos.dat.");
else {
for (j=5; j>0; j--){
fseek(fichero, 0*sizeof(palabra), SEEK_SET);
for (i=0; i<j; i++){
fseek(fichero, i*sizeof(palabra), SEEK_SET);
fread(&palabra, i*sizeof(palabra), 1, fichero);
virt1 = palabra.eff;
fseek(fichero, (i+1)*sizeof(palabra), SEEK_SET);
fread(&palabra, sizeof(palabra), 1, fichero);
virt2 = palabra.eff;
if (virt1 > virt2){
fseek(fichero, i*sizeof(palabra), SEEK_SET);
fread(&palabra, sizeof(palabra), 1, fichero);
//fwrite (&temp, i*sizeof(palabra), 1, fichero);
strcpy (temp.castellano, palabra.castellano);
strcpy (temp.aleman, palabra.aleman);
temp.cont_aciertos = palabra.cont_aciertos;
temp.cont_errores = palabra.cont_errores;
temp.eff = palabra.eff;
fseek(fichero, (i+1)*sizeof(palabra), SEEK_SET);
fread(&palabra, sizeof(palabra), 1, fichero);
fseek(fichero, i*sizeof(palabra), SEEK_SET);
fwrite (&palabra, sizeof(palabra), 1, fichero);
strcpy (palabra.castellano, temp.castellano);
strcpy (palabra.aleman, temp.aleman);
palabra.cont_aciertos = temp.cont_aciertos;
palabra.cont_errores = temp.cont_errores;
palabra.eff = temp.eff;
fseek(fichero, (i+1)*sizeof(palabra), SEEK_SET);
fwrite (&palabra, sizeof(palabra), 1, fichero);
}
}
}
fclose (fichero);
}
fflush(stdin);
printf("\n\nPulse Intro para finalizar...");
getchar();
}
El 10 de marzo de 2012 16:01, Albert Montolio
<albert.montolio en gmail.com>escribió:
> Hola, tengo un problema con el metodo de la burbuja. Lo se hacer para una
> serie de numeros simples, xo no me ha salido para una estructura.
> tengo un fichero donde contiene la estructura palabra, formada por
> palabras y un contador que es la efectividad. quiero ordenar de menor a
> mayor a efectividad todas las palabras (con todos sus campos dentros)
> He implementando este metodo de la burbuja, para ordenar el fichero, pero
> no me lo ordena, me lo deja igual. Alguien me podria ayudar a buscar el
> error?¿ muchas gracias de antemano
>
>
>
> #include <stdio.h>
> #include <string.h>
>
> struct t_palabra {
> char castellano[40];
> char aleman[40];
> float cont_aciertos;
> float cont_errores;
> float eff;
> };
>
> int main (void)
> {
> FILE *fichero;
> struct t_palabra palabra;
> struct t_palabra temp;
> char respuesta[40];
> int i, j, nPalabras;
>
>
>
> fichero = fopen ("datos.dat", "rb+");
> if (fichero == NULL)
> printf ("Error: No se ha podido abrir el fichero datos.dat.");
> else {
>
> for (j=2; j>0; j--){
>
> fseek(fichero, 0*sizeof(palabra), SEEK_SET);
>
> for (i=0; i<j; i++){
>
> if (fread(&palabra, i*sizeof(palabra), 1, fichero) <
> fread(&palabra, (i+1)*sizeof(palabra), 1, fichero)){
>
> fread(&palabra, i*sizeof(palabra), 1, fichero);
> //fwrite (&temp, i*sizeof(palabra), 1, fichero);
>
> strcpy (temp.castellano, palabra.castellano);
> strcpy (temp.aleman, palabra.aleman);
> temp.cont_aciertos = palabra.cont_aciertos;
> temp.cont_errores = palabra.cont_errores;
> temp.eff = palabra.eff;
>
> fread(&palabra, (i+1)*sizeof(palabra), 1, fichero);
> fwrite (&palabra, i*sizeof(palabra), 1, fichero);
>
> strcpy (palabra.castellano, temp.castellano);
> strcpy (palabra.aleman, temp.aleman);
> palabra.cont_aciertos = temp.cont_aciertos;
> palabra.cont_errores = temp.cont_errores;
> palabra.eff = temp.eff;
>
> fwrite (&palabra, (i+1)*sizeof(palabra), 1, fichero);
>
>
> }
> }
> }
>
>
>
> fclose (fichero);
>
>
> }
> fflush(stdin);
> printf("\n\nPulse Intro para finalizar...");
> getchar();
>
> }
>
> El 8 de marzo de 2012 09:48, Albert Montolio <albert.montolio en gmail.com>escribió:
>
> muchas gracias por la ayuda
>>
>> El 6 de marzo de 2012 22:46, Salvador Pozo <salvador en conclase.net>escribió:
>>
>> El pasado 2012-03-06 21:08:55, Albert_Munich escribió:
>>>
>>> A> A Salvador le queria preguntar como es que a el le ha funcionado. Has
>>> A> utilizado mi codigo fuente?
>>>
>>> Hola:
>>>
>>> He utilizado tu programa, lo he hecho de nuevo ahora, y a mi me funciona
>>> correctamente. No entiendo lo que puede estar pasando.
>>>
>>> Te paso "mi versión" del programa, espero que te ayude.
>>>
>>> ----8<------
>>> #include <stdio.h>
>>> #include <string.h>
>>>
>>> struct t_palabra {
>>> char castellano[30];
>>> char ingles[30];
>>> int cont_aciertos;
>>> int cont_errores;
>>> };
>>>
>>> int main (void)
>>> {
>>> FILE *fichero;
>>> struct t_palabra palabra;
>>> char respuesta[30];
>>> int i, nPalabras;
>>>
>>> /* Crea un fichero con dos palabras, quitar los comentarios para que lo
>>> haga cada vez */
>>> /*
>>> fichero = fopen ("datos.dat", "wb+");
>>> strcpy(palabra.castellano, "casa");
>>> strcpy(palabra.ingles, "house");
>>> palabra.cont_aciertos = palabra.cont_errores = 0;
>>> fwrite(&palabra, sizeof(palabra), 1, fichero);
>>> strcpy(palabra.castellano, "coche");
>>> strcpy(palabra.ingles, "car");
>>> fwrite(&palabra, sizeof(palabra), 1, fichero);
>>> fclose(fichero);
>>> */
>>>
>>> fichero = fopen ("datos.dat", "rb+");
>>> if (fichero == NULL)
>>> printf ("Error: No se ha podido abrir el fichero datos.dat.");
>>> else {
>>> i=0;
>>> while(!feof(fichero))
>>> {
>>> fseek(fichero, i*sizeof(palabra), SEEK_SET);
>>> if(fread(&palabra, sizeof(palabra), 1, fichero) > 0) {
>>> printf ("\nEscribe la traduccion de...: ");
>>> printf ("\n%s: ", palabra.castellano);
>>> gets(respuesta);
>>> if (!strcmp(respuesta, palabra.ingles)) {
>>> printf ("\nCorrecto!");
>>> palabra.cont_aciertos++;
>>> } else {
>>> printf ("\nIncorrecto.");
>>> palabra.cont_errores++;
>>> }
>>> fseek(fichero, (-1)*sizeof(struct t_palabra), SEEK_CUR);
>>> fwrite (&palabra, sizeof(palabra), 1, fichero);
>>> i++;
>>> }
>>> }
>>> fclose (fichero);
>>> }
>>> fflush(stdin);
>>> printf("\n\nPulse Intro para finalizar...");
>>> getchar();
>>>
>>> /* Parte para ver el estado final del fichero, quitar comentarios para
>>> activar */
>>> /*
>>> fichero = fopen ("datos.dat", "rb+");
>>> rewind(fichero);
>>> while(!feof(fichero)) {
>>> if(fread(&palabra, sizeof(palabra), 1, fichero)) {
>>> printf("%s Ac: %d Er: %d\n", palabra.castellano,
>>> palabra.cont_aciertos, palabra.cont_errores);
>>> }
>>> }
>>> fclose (fichero);
>>> */
>>> return 0;
>>> }
>>> ----8<------
>>>
>>> Hasta pronto.
>>>
>>> --
>>> 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/20120311/ef9a9d36/attachment.html>
Más información sobre la lista de distribución Cconclase