Ir ao conteúdo
  • Cadastre-se

Gerar Arquivo e Lista Encadeada


MarcosAMS
Ir à solução Resolvido por Ansi C,

Posts recomendados

Bom dia, eu estou precisando de uma ajuda, estou me "querando em um codigo para uma agensa telefonica, eu preciso criar cadastro, imprimir na tela, alterar remover, gerar e imporar um arquivo txt, Meu problema está no txt. 1º na hora de gerar no cadastro eu tenho um loop caso o usuario queira cadastar mais de 1 contato, não opção imprimir na tela mostra todos normais, mas na hora de gerar o arquivo vou usar um exemplo eu crio 4 contatos diferentes, o arquivo txt gera 4 contatos mas todos são iguais e do ultimo contato que eu criei. 2º para importar o txt, ele carrega o arquivo carrega todos os contatos salvos, na hora de imprimir na tela, ele imprimi o que tem no TXT (mesmo sendo tudo repitido) só que ele imprimi umas linhas adicionais cheia de lixo de memoria (as vezes dados sem sentido, comandos cmd, eneredeços de pastas, etc.). Desde já agradeço a ajuda. Segue o codigo:

#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<string.h>//struct do cadastrostruct agenda{    int id;    char nome [20];    char snome [20];    int tel;    struct agenda *prox;};//ponteiros globaisstruct agenda *p=NULL;struct agenda *topo=NULL;struct agenda *fim=NULL;struct agenda *aux=NULL;//variaveis globaisint opcao;int codid,loc,loca;char  insert;//funçõesint inserir(); // inserir dadosint imprimir(); //imprimir dados na telaint alterar(); // localizar dado para alterarint remover(); // localizar e remover dadoint gerararquivo(); // gerar um txtint importararquivo(); //importar um txtint main (){    while (opcao!=7) //menu 7 Sai do programa    {        printf ("  Agenda Telefonica  \n");        printf ("[1]-Inserir          \n");        printf ("[2]-Listar Todos     \n");        printf ("[3]-Alterar          \n");        printf ("[4]-Excluir          \n");        printf ("[5]-Gerar arquivo    \n");        printf ("[6]-Carregar Arquivo \n");        printf ("[7]-Sair             \n");        scanf ("%d",&opcao);        switch (opcao)        {            case 1:            {                inserir();                getch();                system ("cls");                break;                }                        case 2:            {                imprimir();                getch();                system ("cls");                break;            }                case 3:            {                alterar();                getch();                system ("cls");                break;            }            case 4:            {                remover();                getch();                system ("cls");                break;            }            case 5:            {                gerararquivo ();                getch();                system ("cls");                break;            }            case 6:            {                importararquivo ();                getch();                system ("cls");                break;            }            default:            {                printf("Comando invalido\n");            }            }    }}int inserir(){    printf ("1- Cadastrar Contato [S/N]\n"); // Opção para escolher se cadas ou não os dados    scanf ("%s",&insert);    while (insert=='S'|| insert =='s')    {        p=(struct agenda*)malloc(sizeof(struct agenda));  //aloca        if(p!=NULL);        {            codid++; // contador para gerar um id de cadastro            p->id=codid; // inseri esse id            printf ("Digite o Nome: ");            scanf("%s",&(p->nome));            printf ("Digite o Sobrenome: ");            scanf("%s",&(p->snome));            printf ("Digite o Telefone: ");            scanf ("%d",&(p->tel));            p->prox=NULL;            if (topo==NULL)                topo=p;            else                fim->prox=p; // ligando as structs            fim=p;            printf ("Cadastrar outro contato [S/N]\n"); // opção de continuar ou sair            scanf ("%s",&insert);        }    }}int imprimir(){    aux=topo;    while (aux) // imprimir tudo o que estiver cadastrado    {        printf("\n");        printf("Cadastro %d : Contato: %s %s - ",aux->id,aux->nome,aux->snome); // cadastro pronto para consulta (variaveis com string)        printf("Telefone %d",aux->tel); //variaveis interios        printf("\n");        aux=aux->prox;        printf ("\n");    }    printf("Pressione ENTER para voltar ao menu\n");}int alterar(){    printf ("Para localizar digite Numero do Cadastro:");    scanf ("%d",&loc);// variavel para localizar    aux=topo;    while (aux)    {        if(aux->id==loc)        {            printf("Contato: %s %s - ", aux->nome,aux->snome); //mostra o cadstro encontrado            //incio as modificações:            printf("Telefone %d ",aux->tel);            printf("\n");            printf ("Mudar o Nome: ");            scanf("%s",&p->nome);            printf ("\n");            printf ("Mudar o Sobrenome: ");            scanf("%s",&p->snome);            printf ("\n");            printf ("Telefone o Telefone: ");            scanf ("%d",&p->tel);            printf ("\n");        }        else // quando não encontra o cadastro        {            printf ("Contato Nao Localiazado\n");        }        aux=aux->prox;    }    printf("Pressione ENTER para voltar ao menu\n");}int remover(){    printf ("Para localizar digite Numero do Cadastro\n:");    scanf ("%d",&loc);    if (p->prox=NULL) // Se não tiver nenhum dado        printf ("Agenda Vazia\n");    else    {        fim=p;        for (topo=p->prox;topo!=NULL;topo=topo->prox)        {            if(loc==topo->id)            {                fim->prox=topo->prox;                free(topo);                loca=1;            }            printf("Cadastro Excluido\n");            if(loca==1)            break;            fim=topo;            if (topo->prox==NULL && loca==0)            printf ("Cadastro nao Encontrado\n");        }    }    printf("Pressione ENTER para voltar ao menu\n");}int gerararquivo(){    FILE *FPTR; //ponteiro do arquivo    FPTR = fopen ("agenda.txt","w"); //cria um arquivo ou modifica caso já tenho um arquivo criado    aux=topo;    while (aux)    {        fprintf(FPTR,"%s\t",p->nome);        fprintf(FPTR,"%s\t",p->snome);        if (aux==fim)            fprintf(FPTR,"%d",p->tel);        else            fprintf(FPTR,"%d\t",p->tel);        aux=aux->prox;    }    fclose(FPTR); //fecha o arquivo    printf("Contato(s) Salvos");    printf("Pressione ENTER para voltar ao menu\n");    }int importararquivo(){    FILE *FPTR = fopen("agenda.txt", "r");  // abre o arquivo como read (leitura)    if(FPTR==NULL)//se não exite arquivo txt        printf("Ainda não Existe Arquivo de Contatos\n");    else    {        do // ver comentario no while            {                p=(struct agenda*)malloc(sizeof(struct agenda)); //novo aloca                if(p!=NULL);                {                    codid++;                    p->id=codid; // criando id                    //carregando dados do arquivo txt                    fscanf(FPTR,"%s",&(p->nome));                    fscanf(FPTR,"%s",&(p->snome));                    fscanf (FPTR,"%d",&(p->tel));                    p->prox=NULL;                    if (topo==NULL)                        topo=p;                    else                        fim->prox=p;                    fim=p;                }            } while (!feof(FPTR)); // busca até chegar no fim do arquivo    }    fclose(FPTR); //fecha arquivo    printf ("Arquivo Importado\n");    printf("Pressione ENTER para voltar ao menu\n");}
Link para o comentário
Compartilhar em outros sites

  • Solução

OK!
Eu enxerguei algo aqui que me deixou curioso;

O point aux pelo que podemos ver percorre a lista até o ultimo elemento.
Entretanto, a variável point p é quem transfere os dados através de fprintf;
Em momento alguma eu vi a duas trocando referências entre si;

O correto é: aux->nome, etc... ou p = aux e por fim p->nome, etc...

int gerararquivo(){    FILE *FPTR; //ponteiro do arquivo    FPTR = fopen ("agenda.txt","w"); //cria um arquivo ou modifica caso já tenho um arquivo criado    aux=topo;    while (aux)    {        fprintf(FPTR,"%s\t",p->nome);        fprintf(FPTR,"%s\t",p->snome);        if (aux==fim)            fprintf(FPTR,"%d",p->tel);        else            fprintf(FPTR,"%d\t",p->tel);        aux=aux->prox;    }    fclose(FPTR); //fecha o arquivo    printf("Contato(s) Salvos");    printf("Pressione ENTER para voltar ao menu\n");    }
Link para o comentário
Compartilhar em outros sites

entendi legal, vou testar, a questão da importação de lixo de memoria eu consegui resolver, na verdade o problema estava na hora de gerar o arquivo, estava nos tabs (\t), a ultima linha do meu arquivo não pode ter tab por isso que eu já tinha colocado um if:

if (aux==fim)            fprintf(FPTR,"%d",p->tel);        else            fprintf(FPTR,"%d\t",p->tel);

só que mesmo assim na ultima linha ele gerava esse tab, então me deu na cabeça de mudar o while (aux) {} para do{}while (aux); não explicar porque mas deu certo


Mauro é isso mesmo que você falou, deu certo, agora está funcionando ok, muito obrigado.

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

Visitante
Este tópico está impedido de receber novas respostas.

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