Ir ao conteúdo

Posts recomendados

Postado

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);
}

 

Postado

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.

Postado

@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

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!