Jump to content

Guardar dados em ficheiro


alphasil

Recommended Posts

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

É 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

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

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 by alphasil
gmc11

 

Link to comment
Share on other sites

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

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

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 by bsccara
Link to comment
Share on other sites

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.