Ir ao conteúdo
  • Cadastre-se

C Erro com código de BestScore


Marcelo Danelon

Posts recomendados

Bom dia.

 

Estou tentando realizar um bestScore que armazene se tiver pontos maiores que os pontos anteriores, no código eu estou lendo o arquivo e verificando se o valor armazenado nele é maior que os pontos na partida, mas o código para nesse ponto e encerra o programa.

 

o que eu estou fazendo de errado?

 

void bestScore( int pontos ){

    FILE *p;
    int best=0;
    int best2=0;

    p=fopen("ranking.qz","rb");
    if ( p!=NULL ) {
            fread(best,sizeof(pontos),1,p);
            fclose(p);
    }
    else{
       printf("Erro ao abrir o arquivo");
    }

    if(pontos>best){
        p=fopen("ranking.qz","wb");
        if ( p!=NULL ) {
        fputs(pontos,p);
        }
        else{
            printf("Erro ao abrir o arquivo.");
        }
    }
    fclose(p);
    printf("conseguiu! %i",best);
}

 

Link para o comentário
Compartilhar em outros sites

Uma coisa que você poderia fazer pra evitar o excesso de chaves: verificar se não abriu o arqui com o if e retornar depois em caso afirmativo.

Por exemplo, vou ajustar seu código, veja por si mesmo como fica diferente, fica mais legível a leitura. Ver abaixo:
 

void bestScore( int pontos ){

  FILE *p;
  int best=0;
  int best2=0;

  p=fopen("ranking.qz","rb");
  if (p == NULL){
    printf("Erro ao abrir o arquivo");
    //agora retorna da função neste ponto
    return;
  }
  
  fread(best,sizeof(pontos),1,p);
  fclose(p);
  
  if (pontos <= best)
    //aqui retorna porque os pontos lidos são piores que o best
    return;
 
  //reabre o arquivo em modo escrita
  p=fopen("ranking.qz","wb");
  if (p ==NULL){
    printf("Erro ao abrir o arquivo.");
    return;
  }
  
  fputs(pontos,p);
  fclose(p);
  printf("conseguiu! %i",best);
}

Observe que você ainda pode separar essa função em duas, tipo, uma que somente lê o score, e a outra que somente grava o score e daí você evita que a função fique com tarefas excessivas.

Link para o comentário
Compartilhar em outros sites

@Marcelo Danelon , @cpusam Bom Dia!

 

CRASH

Tempo médio de leitura: 11/2 minuto


p = fopen ("ranking.qz","rb");
if (p  !=  NULL)
{
	fread (best, sizeof (pontos), 1, p);
	fclose (p);
}

Fread função com erro no primeiro argumento (void *)

I. Localiza-se erro na chamada de fread. Os argumentos da função são do tipo:

 

  1. void * ponteiro genérico
  2. size_t : inteiro sem sinal (somente não negativos)
  3. size_t : inteiro sem sinal (somente não negativos)
  4. FILE * : ponteiro para fluxo de arquivo do sistema

 

O que estamos esquecendo é de passar no primeiro argumento da função uma referência válida (sem erro).

 

Entendendo o travamento do sistema (crash)

o9mbJRc-pgc5fdt82JEM5yNxFomzV9HceBytO4m0

Segmentation Fault

 

Em 18/10/2019 às 08:00, Marcelo Danelon disse:

código eu estou lendo o arquivo e verificando se o valor armazenado nele é maior que os pontos na partida, mas o código para nesse ponto e encerra o programa.

 

Não entende o porquê do interrompimento do sistema? É interrompido por Erro de acesso violado à Memória. O programa tenta grava na referência 0  (índice) da memória do sistema. Por quê? Zero é o valor (argumento) na variável da função best durante a chamada.

 

 

Aplicando o operado & (ampersand)

int best = 0;

fread ( best, sizeof (pontos), 1u, p); /* NO  */
fread (&best, sizeof (pontos), 1u, p); /* YES */
  • Esse pode não ser o único problema que causa crash, mas é um!

 

 

Outras problemas adjacentes 

Em 18/10/2019 às 11:02, cpusam disse:

//reabre o arquivo em modo escrita 
p = fopen ("ranking.qz","wb"); 
if (p == NULL)
{	
	printf ("Erro ao abrir o arquivo.");
 	return;
}

 

 

O comentário comunica reabrir, mas o que realmente acontece vai além, está sobrescrevendo (se tem algum conteúdo será descartado e o arquivo será tratado como novo) e só depois aberto, ou seja, cria o arquivo novo e o abre em modo escrita binária.

 

Em 18/10/2019 às 08:00, Marcelo Danelon disse:

p = fopen ("ranking.qz","wb");
if ( p!=NULL )
{ 
	fputs (pontos, p);
}

 

 

O arquivo está sendo criado e aberto em modo escrita binária, contudo, a função é pra textos. Descida-se é binário: "wb" + fwrite, ou é texto: "w" + fputs, fprintf

 

 

Obrigado.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...