alphasil Posted June 19, 2012 at 11:28 PM Report Share #464277 Posted June 19, 2012 at 11:28 PM Oi ppl Qual é a melhor forma de criar uma função que guarde num ficheiro um top de jogadores, ou seja por pontuação e em ordem decrescente. Estou a pensar assim Tenho uma estrutura com nome, nick, pass, log o jogador joga o jogo e quando terminado tem a sua pontuação quero aproveitar: nick, % respostas certas e pontuação, tenho de recorrer a estrutura?? Depois tem de ser guardado num ficheiro e quando for ler tem de estar naquela ordem (bubblesort)? Opiniões?? gmc11 Link to comment Share on other sites More sharing options...
bsccara Posted June 19, 2012 at 11:35 PM Report Share #464279 Posted June 19, 2012 at 11:35 PM É mais simples se usares uma estrutura para conter os valores; defines a estrutura com os campos, crias uma função para imprimir ou lá o que quiseres fazer com os valores, outra para gravar a estrutura para um ficheiro e outra para carregar uma estrutura gravada num ficheiro para um bloco de memória apropriado. Quanto a ordem, grava já na ordem que te interessa. Link to comment Share on other sites More sharing options...
alphasil Posted June 19, 2012 at 11:40 PM Author Report Share #464280 Posted June 19, 2012 at 11:40 PM Obrigado bsccara Já percebi, só que a ordem não a posso definir por mim, imagina que eu jogo e faço 20 pontos, e grava, a seguir jogas tu, e fazes 21, passas-me a frente percebes? A dúvida é como fazer isso numa estrutura, num array sei. 😞 gmc11 Link to comment Share on other sites More sharing options...
pmg Posted June 20, 2012 at 06:55 AM Report Share #464295 Posted June 20, 2012 at 06:55 AM De cada vez que les o ficheiro dos tops de jogadores, les o ficheiro completo para um array (com 20 elementos). Quando acaba um jogo, se necessario actualizas o array dos tops (reordenando) e gravas os novos tops. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
alphasil Posted June 20, 2012 at 02:43 PM Author Report Share #464382 Posted June 20, 2012 at 02:43 PM (edited) Oi Já estou a ocnseguir guardar a estrutura do jogo com os dados que quero num ficheiro, agora surgiu-me outro problema com o qual não contava. Tenho 3 users registados, na função listarjogadores dá-me 3 na função login dá 2, Ponho o user e a única coisa que compara é o 1º user..., se ponho outro não dá, nick errado.depois do fread não devia ter os valores todos?? O meu login é este: int login() { struct jogador j; int reg=0, op; char usr1[30], pass[30], auxiliar[30]; FILE *fp; fp=fopen("registos.dat", "rb+"); printf ("\n*=============================================================================*\n"); printf ("| >>>> Login de Jogadores <<<< |\n"); printf ("*=============================================================================*\n"); printf (" \n"); printf("\n1- Registar | 2- Registado\n"); scanf("\n%d", &op); getchar(); if(op==1) { registo(); } if(op==2) { reg=fread(&j, sizeof j, 1, fp); while(reg==1) { reg++; printf("\nExistem %d jogadores registados\n", reg); printf("\nIntroduza o seu nickname: \n"); fgets(auxiliar,29,stdin); sscanf(auxiliar,"%[^\n]",usr1); if(strcmp(usr1,j.nick)==0) { printf("\nIntroduza a sua password: \n"); fgets(auxiliar,29,stdin); sscanf(auxiliar,"%[^\n]",pass); if(strcmp(pass,j.pass)==0) { system("cls"); printf ("\n*=============================================================================*\n"); printf ("| >>>>Tipo de Jogo<<<< |\n"); printf ("*=============================================================================*\n"); printf("\n 1 - Jogo curto (2 perguntas) \n"); printf("\n 2 - Jogo medio (4 perguntas) \n"); printf("\n 3 - Jogo grande (8 perguntas)\n"); printf ("*=============================================================================*\n"); scanf("%d", &op); getchar(); switch (op) { case 1: gp1_Ques(usr1); break; case 2: gp1_Ques2(usr1); break; case 3: gp1_Ques3(usr1); break; default: printf("\nOpcao invalida\n"); return 0; } } else { printf("Password errada"); return 0; } } else { printf("Nickname errado"); return 0; } } } fclose(fp); return 0; } Escapa-me alguma coisa?? Obrigado Edited June 20, 2012 at 02:44 PM by alphasil gmc11 Link to comment Share on other sites More sharing options...
bsccara Posted June 20, 2012 at 05:29 PM Report Share #464448 Posted June 20, 2012 at 05:29 PM Não, só estás a carregar os dados do primeiro utilizador. A função fread() só executa uma vez e carrega uma única estrutura do tipo jogador. Deves usar o método que indiquei no fórum (acho que foi contigo) para calcular o número de registos no ficheiro, alocar um bloco de memória dinâmica suficiente para conter <número de jogadores> estruturas do tipo jogador e depois usar a fread() para carregar esse número de registos (3º parâmetro igual a <número de jogadores>). Depois deves pedir o nickname e só então percorrer as estruturas jogador que gravaste no bloco para encontrar uma com esse nick e depois perguntar e confirmar a password. Link to comment Share on other sites More sharing options...
alphasil Posted June 20, 2012 at 05:50 PM Author Report Share #464452 Posted June 20, 2012 at 05:50 PM Já consegui, obrigado, agora tenho de entregar isso e não me reconehece o user, estava em *.dat e não conseguia o login mesmo sabendo que tinha o user válido e surpresa minha...olha como aparece... *=============================================================================* | >>>> Login de Jogadores <<<< | *=============================================================================* 1- Registar | 2- Registado 2 Existem 1 jogadores registados Introduza o seu nome: Gil Gil┌ÿìuá►8 assim a função strcmp retorna sempre falso Ja tentei com txt e é a mesma coisa int login() { struct jogador j; int reg=0, op; char usr1[30], auxiliar[30]; FILE *f; f=fopen("registos.txt", "r"); printf("\n1- Registar | 2- Registado\n"); scanf("\n%d", &op); getchar(); if(op==1) { registo(); } if(op==2) { fseek(f,0, SEEK_END); reg=ftell(f) /sizeof j; fseek(f,0,SEEK_SET); rewind(f); printf("\n Existem %d jogadores registados\n", reg); printf("\nIntroduza o seu nome: \n"); fgets(auxiliar,30, stdin); sscanf(auxiliar,"%[^\n]",usr1); rewind(f); printf("%s", usr1); printf("%s", j.nome); while (fread(&j,sizeof j,1,f)==1) { if(strcmp(j.nome,usr1)==0) { printf("\nIntroduza a sua sigla: \n"); } else { printf("Este nick nao existe"); login(); break; } } } fclose(f); return 0; } gmc11 Link to comment Share on other sites More sharing options...
bsccara Posted June 21, 2012 at 08:27 AM Report Share #464525 Posted June 21, 2012 at 08:27 AM (edited) O teu problema será a falta dum zero terminador na string (que neste caso não se pode chamar isso) contida em 'j.nome'. Deves ter esse campo da estrutura definido como um array de caracteres mas não estás a meter o zero final quando lá gravas uma string. Usa um editor hexadecimal de ficheiros (como este) e verifica se no ficheiro, depois dos caracteres Gil tens um zero. Provavelmente não terás mas ele tem de existir para o teu código funcionar. Uma possível solução rápida será garantir que a estrutura jogador é inicializada a zeros antes de a preencher e gravar no ficheiro. P.S. Depois de olhar melhor para o código o facto de teres alguma coisa no campo j.nome é um acaso pois não inicializas a estrutura j com nada; os printfs têm de estar dentro do ciclo while. Também a tua lógica está errada; o que estás a fazer é a verificar se o primeiro registo e apenas o primeiro corresponde ao utilizador introduzido, chamando a função recursivamente (errado) em caso de não ser. P.S.S. Cria o hábito de, quando tens erros no código, limpar da cabeça todos os pressupostos e todos os 'acho que'. Vai dar uma volta, pensa noutra coisa, e depois volta a olhar para o código e diz para ti mesmo o que é que ele faz (e não o que pensas que ele faz). Edited June 21, 2012 at 08:35 AM by bsccara Link to comment Share on other sites More sharing options...
alphasil Posted June 21, 2012 at 12:10 PM Author Report Share #464564 Posted June 21, 2012 at 12:10 PM Bom dia, já alterei isso e já funciona. Agora só me falta usar o sort no ficheiro. Tenho de pôr isso tudo num array de inteiros e depois usar o sort não é?? Sort de arrays sei, não sei é através de ficheiros gmc11 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now