Ir ao conteúdo

Gabsouza12

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

Tudo que Gabsouza12 postou

  1. Estou criando uma espécie de agenda em C++ com lista dinâmica e salvando em um txt porém ele dá o seguinte erro #include <stdio.h> #include <stdlib.h> #include <string.h> struct endereco { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; char cep[10]; struct endereco *proximo; /*ponteiro para a próxima entrada */ struct endereco *anterior; /*ponteiro para registro anterior */ } lista; struct endereco *primeiro; /*ponteiro para a primeiro entrada da lista*/ struct endereco *ultimo; /*ponteiro para a ultimo entrada da lista*/ struct endereco *encontra(char *); void entra(void); void procura(void); void salva(void); void carrega(void); void listar(void); void apaga(struct endereco **, struct endereco **); void armazena(struct endereco *i,struct endereco **inicio, struct endereco **ultimo); void entrada(char *,char *,int); void exibe(struct endereco *); int seleciona_menu(void); int main(void) { /*inicializa os ponteiros de topo e fundo*/ primeiro = NULL; ultimo = NULL; while(1) { switch(seleciona_menu()) { case 1: entra(); break; case 2: apaga(&primeiro, &ultimo); break; case 3: listar(); break; case 4: procura(); /*encontra uma rua*/ break; case 5: salva(); /* grava a lista no disco*/ break; case 6: carrega(); /*lê do disco*/ break; case 7: exit(0); } } } /* Seleciona uma operação */ int seleciona_menu(void) { char s[80]; int c; puts("1 : Inserir um nome"); puts("2 : Apagar um nome"); puts("3 : Listar o arquivo"); puts("4 : Pesquisar"); puts("5 : Salvar o arquivo"); puts("6 : Carregar o arquivo"); puts("7 : Sair"); do { printf("\nEntre com sua escolha: "); gets(s); c = atoi(s); }while(c<0 || c>7); return c; } /* Insere nomes e endereços */ void entra(void) { struct endereco *info; while(1) { info = (struct endereco *)malloc(sizeof(lista)); if(!info) { printf("\nSem memória"); return; } entrada("Entre o nome: ",info->nome,30); if(!info->nome[0]) break; /*Não efetua a inserção */ entrada("Entre a rua: ",info->rua,40); entrada("Entre a cidade: ",info->cidade,20); entrada("Entre a estado: ",info->estado,3); entrada("Entre a cep: ",info->cep,10); armazena(info,&primeiro,&ultimo); } /*laço de entrada*/ } /* Esta função lê ua string de comprimento máximo cont e evita que a string seja ultrapassada. Ela também apresenta uma mensagem */ void entrada(char *mensagem,char *s,int cont) { char p[255]; //int tamanho; do { printf(mensagem); gets(p); //tamanho = strlen(p); if(strlen(p) > (size_t)cont) printf("\nMuito longo\n"); }while(strlen(p) > (size_t)cont); strcpy(s,p); } /*Cria uma lista duplamente encadeada ordenada*/ void armazena(struct endereco *i, /*novo elemento*/ struct endereco **primeiro, /*primeiro elemento da lista*/ struct endereco **ultimo) /*último elemento da lista*/ { struct endereco *velho, *p; if(ultimo == NULL) /*primeiro elemento da lista*/ { i->proximo = NULL; i->anterior = NULL; *ultimo = i; *primeiro = i; return; } p = *primeiro; /* começa no topo da lista*/ velho = NULL; while(p) { if(strcpy(p->nome,i->nome)<0) { velho = p; p = p->proximo; } else { if(p->anterior) { p->anterior->proximo = i; i->proximo = p; i->anterior = p->anterior; p->anterior = i; return; } i->proximo = p; /*novo primeiro elemento*/ i->anterior = NULL; p->anterior = i; *primeiro = i; return; } } velho->proximo = i; /*coloca no final*/ i->proximo = NULL; i->anterior = velho; *ultimo = i; } /* Remove um elementi da lista */ void apaga(struct endereco **primeiro,struct endereco **ultimo) { struct endereco *info; struct endereco *encontra(); char s[80]; printf("Entre o nome: "); gets(s); info = encontra(s); if(info) { if(*primeiro == info) { *primeiro = info->proximo; if(*primeiro) (*primeiro)->anterior = NULL; else *ultimo = NULL; } else { info->anterior->proximo = info->proximo; if(info != *ultimo) info->proximo->anterior = info->anterior; else *ultimo = info->anterior; } free(info); /*devole memoria para o sistema*/ } } /*Encontra um endereço */ struct endereco *encontra(char *nome) { struct endereco *info; info = primeiro; while(info) { if(!strcmp(nome, info->nome) )return info; info = info->proximo; /*obtém novo endereço*/ } printf("Nome não encontrado\n"); return NULL; /*não encontrou*/ } /*Mostra a lista completa*/ void listar(void) { struct endereco *info; info = primeiro; while(info) { exibe(info); info = info->proximo; /*obtém próximo endereço*/ } printf("\n\n"); } void exibe(struct endereco *info) { printf("%s\n",info->nome); printf("%s\n",info->rua); printf("%s\n",info->cidade); printf("%s\n",info->estado); printf("%s\n",info->cep); printf("\n\n"); } /*Procura por um nome na lista*/ void procura(void) { char nome[40]; struct endereco *info; struct endereco *encontra(); puts("Entre com o nome a procurar: "); gets(nome); info = encontra(nome); if(!info) printf("Não encontrou\n"); else exibe(info); } /*Salva o arquivo em disco. */ void salva(void) { struct endereco *info; FILE *fp; fp = fopen("lista.txt","wb"); if(!fp) { puts("Arquivo nao pôde ser aberto"); exit(1); } printf("\nSalvando arquivo...\n"); info = primeiro; while(info) { fwrite(info,sizeof(struct endereco),1,fp); info = info->proximo; /*obtém próximo endereço*/ } fclose(fp); } /*Carrega o arquivo de endereço */ void carrega() { struct endereco *info; FILE *fp; fp = fopen("lista.txt","rb"); if(!fp) { puts("Arquivo nao pôde ser aberto"); exit(1); } /*libera qualquer memória previamente alocada*/ while(primeiro) { info = primeiro->proximo; free(info); primeiro = info; } /*reinicializa os ponteiros de início e fim*/ primeiro = NULL; ultimo = NULL; printf("\nCarregando arquivo...\n"); while(!feof(fp)) { info = (struct endereco *)malloc(sizeof(struct endereco)); if(!info) { printf("sem memória"); return; } if(1 != fread(info,sizeof(struct endereco),1,fp)) break; armazena(info, &primeiro,&ultimo); } fclose(fp); }

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!