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

Gravando Lista S. Encadeada em Arquivos


elizier

Pergunta

Olá pessoal.

Estou com problemas para gravar um lista simplesmente encadeada em um arquivo. Eu consigo gravar apenas 1 registro, quando eu compilo denovo, e vou cadastrar, o registro q tava no arquivo é sobrescrito pelo novo cadastro. Estou com problemas tb para mostrar os dados contidos no arquivo...

Segue o código:

Desde já agradeço.

void cadastro(){
     celula *elemento;
     
     elemento=malloc(sizeof(celula));

     if(elemento==NULL){
       printf("\nErro ao Alocar!");                    
       }else{
        if(cabeca->tamanho==0)
          elemento->proximo=NULL;          
        else
         elemento->proximo = cabeca->inicio;
                               
        cabeca->inicio=elemento;
        cabeca->tamanho++;        
        
        getchar();
        printf("\nDigite o nome:" );
        gets(elemento->dados.nome);
        printf("\nCidade: ");
        gets(elemento->dados.cidade);
        printf("\nDigite o Codigo Area do Telefone: ");
        scanf("%d", &elemento->dados.cod_area); 
        printf("\nDigite o Numero do Telefone: ");
        scanf("%d", &elemento->dados.telefone);
        printf("\nObservacoes: ");
        getchar();
        gets(elemento->dados.obs);
        
         FILE *arq;
   
         arq= fopen ("agenda", "wb"); 
  
         if (!arq )          
           printf (" Erro ao abrir arquivo !");          
          else{        
             fwrite (&elemento->dados , sizeof (info), 1, arq );            
             fclose (arq);             
          }
         }                   
}

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olá.

Seria interessante você criar alguns subprogramas que facilitem esse serviço para você. Recomendo que faça um para cadastrar e outro para gravar. E, no main, faça um loop para chamar essas funções a cada novo registro.

Implemente os subprogramas e poste-os aqui. Vamos corrigi-los pouco a pouco para que você aprenda, também.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Junior. Então...

Fiz o que você indicou, e o processo de gravação tah dando certo. O problema é na função que exibe o conteúdo do arquivo, ela está sempre duplicando o último registro. Se eu cadastro, um exemplo, Maria, e gravo no arquivo, na hora de imprimir na tela o registro aparece duas vezes. Isso só acontece com o último registro cadastrado. Ou seja o problema não é no arquivo, nem na gravação e sim na função que a exibe.

Obrigado.

Segue o código:

---------------------------GRAVANDO NO ARQUIVO-----------------------------

void gravaNoArquivo(){
     int op=1;
     celula *elemento;

FILE *arq;
arq=fopen ("agenda.dat", "a+b"); 

if (! arq )
printf (" Erro ao abrir arquivo !");
 else{
       while (op!=0){
       elemento=malloc(sizeof(celula));
       if(elemento==NULL){
       printf("\nErro ao Alocar!");                    
       }else{
        if(cabeca->tamanho==0)
          elemento->proximo=NULL;          
        else
         elemento->proximo = cabeca->inicio;
                               
        cabeca->inicio=elemento;
        cabeca->tamanho++;           
        
        getchar();

        printf("\nDigite o nome:" );
        gets(elemento->dados.nome);
        
        printf("\nDigite o Numero do Telefone: ");
        scanf("%d", &elemento->dados.telefone);
        
                
             fwrite (&elemento->dados, sizeof (struct informacoes), 1, arq );
             printf (" Deseja gravar mais dados (1/0)? ");
             scanf ("%d", &op );
        }
       }
        fclose (arq);
 }
}
---------------------------LENDO O ARQUIVO-----------------------------
void lerArquivo(){
     struct provisorio
     {
       long int telefone;
       int cod_area;
       char nome[50], cidade[20], obs[200];       
     };
typedef struct provisorio repositorio;

repositorio repo;
     
     FILE *arq;
     arq= fopen ("agenda.dat", "rb");
     
     if (! arq )
     printf ("Erro ao abrir arquivo !");
   else{

     printf ("\n*** Agenda - Relatorio ***\n");
     
     do{
     /* o dado é lido e armazenado na estrutura */
     fread (&repo , sizeof (repositorio), 1, arq );
     printf ("\nNome: %s", repo.nome );
     printf ("\tFone: %ld\n\n", repo.telefone );
     }while (!feof(arq));
     fclose (arq);
   }
}

Editado por elizier
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,1k
    • Posts
      651,9k
×
×
  • Criar Novo...