Ir para conteúdo
Fórum Script Brasil
  • 0

Qual o Erro dessas Funções? Eu estou fazendo uma agenda telefônica com arquivo binário, mas na função listar contato, só ta listando apenas um contato. Não consegui descobrir qual é o erro, quem puder ajudar, obrigado !


Mattheusadh

Pergunta

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TAM 2 
int cont;
 
struct data{
 int dia;
 int mes;
 int ano;
}; 
   
struct contato{
   char nome[50];
   char fone[15];
   struct data niver;
}agenda[TAM]; 

enserir(){
 FILE *arq;
  arq=fopen("agenda.data","ab");        
   if(arq==NULL){
      printf("Erro na abertura do arquivo.\n");
   }else{
      if(cont<=TAM){
       do{
       fflush(stdin); 
       printf("\nInsira o nome do contato: ");
       scanf("%s", &agenda[cont].nome);
       printf("Insira o telefone do contato: ");
       scanf("%s", &agenda[cont].fone);
       printf("Insira a data de aniversario do contato: ");
       scanf("%d %d %d", &agenda[cont].niver.dia, &agenda[cont].niver.mes, &agenda[cont].niver.ano);
         fseek(arq, cont*sizeof(struct contato), SEEK_SET); 
         fwrite(agenda,sizeof(struct contato),1,arq);
         cont++;
          printf("\nContato salvo com sucesso.\n");
         printf("Deseja inserir mais contatos? (s/n) : ");           
       }while(getche() == 's');
       }else{
             printf("Agenda cheia");
          }
      fclose(arq);    
    }
}              

listar(){
   FILE *arq;
   struct contato aux;
    arq=fopen("agenda.data","rb");
      if(arq==NULL){
         printf("Erro na abertura do arquivo.\n");
      }else{
         while(fread(&aux, sizeof(struct contato),1,arq)==1 && !feof(arq)){
            printf("\nNome: %s\n", aux.nome);
             printf("Telefone: %s\n", aux.fone);
             printf("Aniversaio: %d/%d/%d\n",aux.niver.dia,aux.niver.mes,aux.niver.ano);         
              fread(&aux, sizeof(struct contato), 1, arq);
            }
       }
   fclose(arq);
   getch();
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
fseek(arq, cont*sizeof(struct contato), SEEK_SET); 

Quando usas "a" ou "ab" para abrir um ficheiro, o ponteiro de escrita vai sempre para o final do arquivo. Funções para reposicionar o ponteiro (como o seek que utilizas-te) são ignoradas. Mas de qualquer dar formas essa parte está bem.

while(fread(&aux, sizeof(struct contato),1,arq)==1 && !feof(arq)){
            printf("\nNome: %s\n", aux.nome);
             printf("Telefone: %s\n", aux.fone);
             printf("Aniversaio: %d/%d/%d\n",aux.niver.dia,aux.niver.mes,aux.niver.ano);         
              fread(&aux, sizeof(struct contato), 1, arq); 

Mas aqui, quando extrais os dados, utilizas duas vezes o "fread", uma enquanto estás a verificar, e outra no final (não sei porque).

Tira essa do final e vais ver que vai funcionar.

if(cont<=TAM){

Outro erro que eu vi, que te poderá dar problemas no futuro é essa expressão. cont não pode ser igual a TAM, pois o ultimo elemento do array é TAM - 1

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...