Jump to content

fread que não mostra tudo....estranho


alphasil

Recommended Posts

Oi ppl;

Mais uma batalha que me se tem atravessado no meu caminho.

Tenho uma função que vê as perguntas que tenho e imprime os dados todos.

void ver_perguntasgp2(struct gp2 *p)
{
int retorno, cont = 0;
FILE *f;
if ((f= fopen("gp2.dat", "rb")) == NULL)
{
 printf("Erro ao abrir ficheiro\n");
}
printf ("\n*=============================================================================*\n");
   printf ("|					   >>>>Visualizacao de perguntas<<<<					  |\n");
   printf ("*=============================================================================*\n");
   printf ("																			   \n");
retorno = fread(p, sizeof *p, 1, f);
while ( retorno == 1)
{
 cont++;
 printf("\nId : %d \n", p->id);
 printf("\nPergunta : %s", p->ques);
 printf("\nResposta Correta : %s",p->res);
 printf("\n");
 retorno= fread(p, sizeof *p, 1, f);
}
printf(" \n\n %d perguntas registadas \n", cont);
fclose(f);
}

Esta está tudo ok

Na outra só me imprime o id e a pergunta, não a resposta...

void gp2_Ques(struct gp2 *p, char *usr1, int *result)
{
   FILE *f; //apontador para ficheiro
   f=fopen("gp2.dat", "r"); //abertura do ficheiro
   char buf[10];
   int reg=0,reg1; //Variaveis contadoras de perguntas e random
   int random; // Variável de random
   int op; //Variáveis opções utilizadores
   int qual; //Variáveis resultados
   rewind(f); //retorna a posição corrente do ficheiro para o início
   srand(time(NULL)); //função random
   system("cls");
   fseek(f, 0, SEEK_END);
   reg=ftell(f) /sizeof *p;
   fseek(f, 0 , SEEK_SET);
   fread(p, sizeof *p, 1, f);
   printf("\nId : %d \n", p->id);  //Imprime
   printf("\nPergunta : %s", p->ques);  //Imprime
   printf("\nResposta Correta : %s",p->res);  //Não Imprime
   printf("\n");
}

Alguém percebe porquê?? Eu sinceramente não....

gmc11

 

Link to comment
Share on other sites

if ((f= fopen("gp2.dat", "rb")) == NULL)

Esta está tudo ok

Na outra só me imprime o id e a pergunta, não a resposta...

   f=fopen("gp2.dat", "r"); //abertura do ficheiro

O modo de abertura do ficheiro é diferente nas duas versões ...

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

Bom dia

E não é que era mesmo isso...incrível, estive até as 3 da manhã e não reparei nisso.

😕 😕 😕 :confused:

Agora já me aparece a resposta se eu quiser.

Já agora, se reparar tenho um random para gerar números aleatórios em função do número de registos, e com esse random dá-me uma pergunta, se eu quiser um ciclo for de 8, já não posso usar o random pois não?

Obrigado

gmc11

 

Link to comment
Share on other sites

Explica lá essa coisa do random melhor (possivelmente noutro tópico) ... não tens nenum número aleatório no teu código: tens apenas a chamada à inicialização do gerador de números aleatórios. Essa inicialização deve ser chamada apenas uma vez por execução do programa (e não uma vez por função ou ciclo).

Normalmente mete-se o srand(time(NULL)); dentro da função main, e chama-se a função [/tt]rand()[/tt] quando se quer um número aleatório.

Podes gerar números aleatórios dentro de ciclos, claro!

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

Olá

Pois, não reparei que não tinha lá o random, mas prontos, a função é esta:

void gp2_Ques(struct gp2 *p, char *usr1, int *result)
{
   FILE *f; //apontador para ficheiro
   f=fopen("gp2.dat", "rb"); //abertura do ficheiro
   char buf[10];
   int reg=0,reg1; //Variaveis contadoras de perguntas e random
   int random; // Variável de random
   int op; //Variáveis opções utilizadores
   int qual; //Variáveis resultados
   rewind(f); //retorna a posição corrente do ficheiro para o início
   srand(time(NULL)); //função random
   system("cls");
   fseek(f, 0, SEEK_END);
   reg=ftell(f) /sizeof *p;
   fseek(f, 0 , SEEK_SET);
   if (reg<=0) //condição que verifica se existem registos
   {
    printf ("Sem registos \n");
    printf ("\n Necessario ter registos para jogar...\n");
    return;
   }
   else
   {
if(op==1)
    {
	    fseek(f, reg1 * sizeof *p, SEEK_SET);
	    fread(p, sizeof *p, 1, f);
	    printf("%s transporta %d pontos da anterior fase \n",usr1, result);
	    printf("\nPergunta : %s", p->ques);
	    printf("\nResposta correta? (facto ou ficcao)\n");
	    fgets(buf,9,stdin);
	    printf("A variavel buf tem %s", buf);
	    if(strcmp(buf,p->res)==0) //compara as duas stringd
		    {
			    printf("\nAcertou na resposta...");
			    result++;
			    random=rand()%reg; //função random
			    reg1 = random; //atribui a variavel reg o valor de random
			    fseek(f, reg1 * sizeof *p, SEEK_SET);
			    fread(p, sizeof *p, 1, f);
			    printf("\nPergunta : %s", p->ques);
			    printf("\nResposta correta? (facto ou ficcao)\n");
			    fgets(buf,9,stdin);
			    if(strcmp(buf,p->res)==0)
			    {
				    printf("\nAcertou na resposta...");
				    result++;
				    printf("Valor de result %d\n", result);
				    printf("\nPassou a segunda fase...parabens\n");
				    //por aqui gp3_Ques
			    }
			    else
			    {
				    printf("\nResposta errada\n");
				    printf("\nFoi eliminado....tente novamente\n");

			    }
		    }
		    else
		    {
			    printf("Resposta errada");
			    printf("\nFoi eliminado....tente novamente\n");
			    Sleep(2000);
			    system("cls");
			    jogo();
}
}

Se reparar faço a leitura dos registos com o fseek e atribuo ao reg o valor encontrado, depois faço um random desse valor e atribio a reg1.

Isso funciona bem, agora se quiser pôr 10 perguntas, tem que me criar 10 numeros diferentes para pôr 10 perguntas diferentes, isso pode ser dentro do ciclo?? Não estou a ver como.

gmc11

 

Link to comment
Share on other sites

Alguém me consegue explicar isso??

if(result1>=3)
	    {
		    printf("\nTeve um total de %d", result1);
		    printf("Tem %d da fase anterior", result);
		    result+=result1;
		    printf("\n 1. Tem pontuacao total de %d\n", result+result1);
		    printf("\n 2. Tem pontuacao total de %d\n", result);
		    printf("\nVai passar para a fase 3...aguarde \n");
		    Sleep(2000);
	    }

result=2

result1=3

Total no primeiro caso 26

Total no segundo caso 14

Eu tenho de voltar a primária...só pode...

gmc11

 

Link to comment
Share on other sites

... agora se quiser pôr 10 perguntas, tem que me criar 10 numeros diferentes para pôr 10 perguntas diferentes, isso pode ser dentro do ciclo?? Não estou a ver como.

Para criares números aleatórios sem repetição tens que usar um método mais complicado que apenas gerar números aleatórios.

Sugiro o método de Fisher-Yates.

Basicamente enche um array com os valores pretendidos, escolhe um elemento ao acaso desse array e depois "apaga" o elemento. Repete até o array estar vazio.

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,

Optei por criar uma função só com o random e perguntas.


int jogo1Gp1(FILE *f, int res1)
{
struct perg p;
int resposta;
fseek(f, res1 * sizeof p, SEEK_SET);
fread(&p, sizeof p, 1, f);
printf("\nPergunta : %s", p.ques);
printf("\nOpcao 1 : %s",p.op1);
printf("\nOpcao 2 : %s",p.op2);
printf("\nOpcao 3 : %s",p.op3);
printf("\nOpcao 4 : %s",p.op4);
printf("\nResposta correta?\n");
scanf("%d", &resposta);
getchar();
if(resposta==p.res)
return 1;
else
return 0;
}

e agora noutra função chamo esta


void gp1_Ques(struct perg *p, char *usr1)
{
FILE *f; //apontador para ficheiro
f=fopen("gp1.dat", "r"); //abertura do ficheiro
int reg=0,reg1; //Variaveis contadoras de perguntas e random
int random; // Variável de random
int op, resposta; //Variáveis opções utilizadores
int qual, result=0; //Variáveis resultados
rewind(f); //retorna a posição corrente do ficheiro para o início
srand(time(NULL)); //função random
system("cls");
fseek(f, 0, SEEK_END);
reg=ftell(f) /sizeof *p;
fseek(f, 0 , SEEK_SET);
if (reg<=0) //condição que verifica se existem registos
{
	printf ("Sem registos \n");
	printf ("\n Necessario ter registos para jogar...\n");
	return;
	}
	else
	{
		random=rand()%reg; //função random
		reg1 = random; //atribui a variavel reg o valor de random
		jogo1Gp1(f,reg1);
		if ( jogo1Gp1(f,reg1) )
		{
			printf("\nAcertou na resposta...\n");
			result++;
			random=rand()%reg; //função random
			if ( jogo1Gp1(f,random) )
			{
				printf("\nAcertou novamente na resposta...\n");
				result++;
				}
				else
				{
					printf("Errou nesta questao...\n");
					}
					}
	}
}

Quis simplificar para não expandir muito o código, o raciocíonio está certo, a implementação é que está a falhar...lol

O que acham?

Edited by alphasil
gmc11

 

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.