Jump to content

[Resolvido] Sort de um ficheiro....ajuda


Recommended Posts

Posted

Olá ppl;

É a minha última coisinha que preciso de ajuda

Tenho um ficheiro que guarda estes dados

Nome % Pontos

Tenho de ordená-los, já estou farto de procurar exemplos que possa adaptar mas não encontro nada de jeito

Tenho esta função que me lê os registos todos

int topJogos()
{
   struct jogoJogado j;
   int retorno, cont = 0;
FILE *f;
if ((f= fopen("jogos.dat", "rb")) == NULL)
{
 printf("Erro ao abrir ficheiro\n");
}
printf ("\n*=============================================================================*\n");
   printf ("|						 >>>>Top 10 de jogadores<<<<						 |\n");
   printf ("*=============================================================================*\n");
   printf ("																			   \n");
printf("\n\t+----------+-----------+------------+");
   printf("\n\t| Nome	  | Pontos	 | P.Certas |\n");
printf("\n\t+----------+-----------+------------+");
retorno = fread(&j, sizeof j, 1, f);
while ( retorno == 1)
{
 cont++;
 printf("\n\t|%-10s |%-10i  |%3.2f \n",j.nome, j.res_final, j.p_certas);
 printf("\n");
 retorno= fread(&j, sizeof j, 1, f);
}
printf("\n\t+----------+-----------+------------+");
printf(" \n\n %d Top de jogadores  \n", cont);
printf ("*=============================================================================*\n");
rewind(f);
fclose(f);
return 0;
}

Agora, conforme os resultados tenho de ordenar

Tenho de ler isso tudo para um array e depois usar o qsort? Poderiam dar-me umas dicas ou exemplo concreto se faz favor'?

Obrigado

gmc11

 

Posted

Boas

Deves carregar toda a informação para a memória, ordená-la usando um método de ordenação, quer seja o bubble sorte ou selection sort. Penso que este seja o método mais simples de resolver essa questão.

Cumps

Posted

algo deste género

int comparador(const void * elem1, const void * elem2) {
 // ordenar pelo valor res_final
 return ((struct jogoJogado *)elem1)->res_final = ((struct jogoJogado *)elem2)->res_final;
}

int main(void) {
 struct jogoJogado lista[10];

 // lês toda a informação do ficheiro para a lista
 // ...

 // argumentos
 //  1 - lista a ordenar
 //  2 - numero de elementos a ordenar (estou a assumir que a lista tem 10 elementos)
 //  3 - tamanho em bytes de cada elemento em memória
 //  4 - ponteiro para a função usada para ordenar
 qsort(lista, 10, sizeof(struct jogoJogado), comparador);

 // voltas a escrever tudo no ficheiro
 // ...

 return 0;
}

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)

Dá-me um erro e um warning....

int comp()
{
    struct jogoJogado lista[10];
   FILE *f;
   f=fopen("jogos.dat", "rb");
   fseek(f, 0, SEEK_END);
   lista = (jog*) malloc(sizeof(struct jogoJogado) * 10);
   int i = 0;
   while(fgets(list, sizeof(struct jogoJogado), f) != NULL)
   {
       sscanf(lista,"%s %s", jog[i].nome, jog[i].p_certas, jog[i].res_final);
       i++;
   }
}

Edited by alphasil
gmc11

 

Posted (edited)
sscanf(lista,"%s %s", jog[i].nome, jog[i].p_certas, jog[i].res_final)

tens 2 % no filtro, mas 3 argumentos. O warning deve vir daqui. Quanto ao erro, posta aí a mensagem que dá. Sem isso nada feito.

struct jogoJogado lista[10];
lista = (jog*) malloc(sizeof(struct jogoJogado) * 10);

Estás a alocar memória para um array que já está declarado acima... Se queres declaração dinâmica, passa o array para struct jogoJogado *lista; (podes continuar a usar como array depois de alocado o espaço).

fgets(list, sizeof(struct jogoJogado), f)

Tens uma estrutura binária e estás a usar uma função que lê uma string... vê o fread.

list ou lista?

 sscanf(lista,"%s %s", jog[i].nome, jog[i].p_certas, jog[i].res_final);

lista não é uma string, mas um array de structs... jog devia ser lista, não?

Estás a fazer uma salgalhada aí...

Edited by Flinger
Posted

Já dá sem erros

int comp()
{
   struct jogoJogado *listas[10];
   FILE *f;
   f=fopen("jogos.dat", "rb");
   if(!f)
   {
    printf("Erro");
   }
   else
   {
  listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado));
  int i;
  int retorno=fread(listas[0], sizeof(struct jogoJogado), 1, f);
  for(i=1;retorno==1;i++)
  {
	  listas[i]=(struct jogoJogado*)malloc(sizeof(struct jogoJogado));
	  retorno= fread(listas[i], sizeof(struct jogoJogado), 1, f);
    }
    printf("%s   %.2f   %d", listas[0]->nome,listas[0]->p_certas, listas[0]->res_final );
   }
   qsort(listas, 10, sizeof(struct jogoJogado), comparador);
   Sleep(4000);
return 0;
}

Faço print e aparece, agora é só usar o que o HHH disse não é?

gmc11

 

Posted

Oi, erro não dá mas não está a ordenar

Faz o print na ordem que estava.

int comparador(const void * elem1, const void * elem2)
{
   return ((struct jogoJogado *)elem1)->res_final = ((struct jogoJogado *)elem2)->res_final;
}
int comp()
{
   struct jogoJogado *listas[10];
   FILE *f;
   f=fopen("jogos.dat", "rb");
   if(!f)
   {
    printf("Erro");
   }
   else
   {
  listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado));
  int i;
  int retorno=fread(listas[0], sizeof(struct jogoJogado), 1, f);
  for(i=1;retorno==1;i++)
  {
	  listas[i]=(struct jogoJogado*)malloc(sizeof(struct jogoJogado));
	  retorno= fread(listas[i], sizeof(struct jogoJogado), 1, f);
    }
   }
   qsort(*listas, 4, sizeof(struct jogoJogado), comparador);
   int i;
   for(i=0; i<4; i++)
   {
    printf("%s   %d    %.2f   \n", listas[i]->nome, listas[i]->res_final, listas[i]->p_certas );
   }
   Sleep(4000);
return 0;
}
gmc11

 

Posted

Eu já tive de fazer um sort de um ficheiro, eu guardava os dados do ficheiro numa struct e depois era só ordenar com um bubble sort.. 👍

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted (edited)

o erro foi meu ...

o código que está aqui está mal

return ((struct jogoJogado *)elem1)->res_final = ((struct jogoJogado *)elem2)->res_final;

deverá ser

return ((struct jogoJogado *)elem1)->res_final - ((struct jogoJogado *)elem2)->res_final;

troca o = por -

é o que dá responder a toda a gente e escrever código à pressão ...

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

Mesmo assim continua mal

Listagem inicial:

*=============================================================================*

| >>>>Top 10 de jogadores<<<< |

*=============================================================================*

+----------+-----------+------------+

| Nome | Pontos | P.Certas |

+----------+-----------+------------+

|Gil |10 |80.00

|Baby |9 |87.00

|Kill |3 |14.00

|cerdo |6 |87.00

+----------+-----------+------------+

4 Top de jogadores

*=============================================================================*

Listagem inicial

Gil 10 80.00

Baby 9 87.00

Kill 3 14.00

cerdo 6 87.00

Depois do qsort

Baby 9 87.00

Gil 10 80.00

cerdo 6 87.00

Kill 3 14.00

gmc11

 

Posted (edited)

este erro já não é meu !!!

tu é que inventas mesmo a copiar código

//struct jogoJogado *listas[10];
struct jogoJogado listas[10];

//qsort(*listas, 4, sizeof(struct jogoJogado), comparador);
qsort(listas, 4, sizeof(struct jogoJogado), comparador);

e remove estas linhas :

listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado));
...
listas[i] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado));

neste código não existe malloc's nem free's !!!

ps : já agora .. .o código para ler os registos do ficheiro:

//listas[0] = (struct jogoJogado*)malloc(sizeof(struct jogoJogado));
//int i;
//int retorno=fread(listas[0], sizeof(struct jogoJogado), 1, f);
//for(i=1;retorno==1;i++)
//{
//listas[i]=(struct jogoJogado*)malloc(sizeof(struct jogoJogado));
//retorno= fread(listas[i], sizeof(struct jogoJogado), 1, f);
//}
n_elementos = fread(listas, sizeof(struct jogoJogado), 10, f);
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

Tive de fazer uma alteração na função comparar visto que começava do menor para o maior

No entanto, já está tudo.

Muito obrigado a todos os que me ajudaram e revelaram uma enorme paciência.

Obrigadão

gmc11

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.