Ir ao conteúdo
  • Cadastre-se

Dúvida arquivos!


Visitante

Posts recomendados

Eu estou fazendo uma mine-agenda em C, onde a pessoa coloca nome e telefone, e salva em um arquivo "banco.bin".

Já fiz grande parte do código, e queria saber como faço para ter a opção remover contato da agenda.

 

Alguem me ajuda ?

#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <conio.h>//#include <windows.h> para funcao Sleep();typedef struct agenda{    char nome[20];    int telefone;}agenda;FILE *arq;agenda contato;char menu(){    system("cls");    printf("***************  Agenda de Contatos: ***************\n");    printf("\n");    printf("[1] - Adicionar contato\n");    printf("[2] - Mostrar lisa de contatos\n");    printf("[3] - Procurar contato pelo Nome\n");    printf("[4] - Procurar contato pelo Numero\n");    printf("[5] - Modificar contato\n");    //printf("[6] - Remover contato\n");    printf("[9] - Sair\n");    printf("\n**************************************************\n");    printf("\n");    printf("> ");    return (toupper(getche()));}int verifica(char nome[]){    fread(&contato,sizeof(agenda),1,arq);    while(!feof(arq))    {        if (strcmp(contato.nome,nome) == 0)        {            fseek(arq,-sizeof(agenda),SEEK_CUR);            return 1;        }        fread(&contato,sizeof(agenda),1,arq);    }    return 0;}int verifica_num(int num){    fread(&contato,sizeof(agenda),1,arq);    while(!feof(arq))    {        if (contato.telefone == num)        {            fseek(arq,-sizeof(agenda),SEEK_CUR);            return 1;        }        fread(&contato,sizeof(agenda),1,arq);    }    return 0;}void adicionar_contato(){    char nome[20];    arq = fopen("banco.bin","a+b");    if (arq == NULL)    {        printf("Erro ao abrir arquivo\n");        return;    }    printf("\n\n");    printf("Digite o nome: ");    fflush(stdin);    gets(nome);    if (verifica(nome) == 1)    {        printf("\nNome ja existe.\n");    }    else    {        strcpy(contato.nome,nome);        printf("Digite o telefone: ");        scanf("%d", &contato.telefone);        fwrite(&contato,sizeof(agenda),1,arq);    }    fclose(arq);}void modificar(){    char nome[20];    arq = fopen("banco.bin","r+b");    if (arq == NULL)    {        printf("Erro ao abrir arquivo\n");        return;    }    printf("\n\n");    printf("Digite nome do contato: ");    fflush(stdin);    gets(nome);    if (verifica(nome) == 1)    {        printf("\nDigite um novo nome: ");        fflush(stdin);        gets(nome);        strcpy(contato.nome,nome);        printf("\nDigite um novo numero de telefone: ");        scanf("%d", &contato.telefone);        fwrite(&contato,sizeof(agenda),1,arq);    }    else    {        printf("\nNome nao existe.\n");    }    fclose(arq);}void remover_contato(){    /*     * ????     * ???? Dúvida    */}void procura_nome(){    char nome[20];    arq = fopen("banco.bin","r+b");    if (arq == NULL)    {        printf("Erro ao abrir arquivo\n");        return;    }    printf("\n\n");    printf("Digite o nome: ");    fflush(stdin);    gets(nome);    if (verifica(nome) == 1)    {        fread(&contato,sizeof(agenda),1,arq);        printf("\n\n");        printf("----------------------------------------\n");        printf("CONTATOS          |            TELEFONE \n");        printf("----------------------------------------\n");        printf("%-20s           %8d\n", contato.nome,contato.telefone);        printf("----------------------------------------\n");    }    else    {        printf("\nContato nao existe.\n");    }    fclose(arq);}void procura_num(){    int num;    arq = fopen("banco.bin","r+b");    if (arq == NULL)    {        printf("Erro ao abrir arquivo\n");        return;    }    printf("\n\n");    printf("Digite o telefone: ");    scanf("%d", &num);    if (verifica_num(num) == 1)    {        fread(&contato,sizeof(agenda),1,arq);        printf("\n\n");        printf("----------------------------------------\n");        printf("CONTATOS          |            TELEFONE \n");        printf("----------------------------------------\n");        printf("%-20s           %8d\n", contato.nome,contato.telefone);        printf("----------------------------------------\n");    }    else    {        printf("\nContato nao existe.\n");    }    fclose(arq);}void mostrar_lista(){    arq = fopen("banco.bin","r+b");    if (arq == NULL)    {        printf("Erro ao abrir arquivo\n");        return;    }    printf("\n\n");    printf("----------------------------------------\n");    printf("CONTATOS          |            TELEFONE \n");    printf("----------------------------------------\n");    //    fread(&contato,sizeof(agenda),1,arq);    //    while (!feof(arq))    {        printf("%-20s           %d\n", contato.nome,contato.telefone);        fread(&contato,sizeof(agenda),1,arq);    }    printf("----------------------------------------\n");    fclose(arq);}int main(){    char op;    do    {        op = menu();        switch(op)        {            case '1': adicionar_contato(); break;            case '2': mostrar_lista(); break;            case '3': procura_nome(); break;            case '4': procura_num(); break;            case '5': modificar(); break;            //case '6': remover_contato(); break;        }        printf("\n");        system("PAUSE");    }while (op != '9');    return 0;}
Link para o comentário
Compartilhar em outros sites

@slackforgo

 

 

Faça uso de um arquivo temporário. É o procedimento padrão que normalmente é feito.

 

Grave todos os registros no arquivo temporário, excetuando o registro a ser excluído. Ao final, sobrescreva o seu arquivo principal e apague o temporário.

 

 

Bem simples.

 

 

 

LNW

Link para o comentário
Compartilhar em outros sites

@LNW

 

Bom estou tentando fazer o que você disse, mas como eu faria esse "excetuando".

 

 

Pode me da uma dica ?

.....fread(&contato,sizeof(agenda),1,arq);    while (!feof(arq))    {        op = 0;        if (strcmp(contato.nome,nome) == 0) //compara o nome, para exceder        {           op = 1;        }        fread(&contato,sizeof(agenda),1,arq); //lê arquivo        if (op == 0)        {            fwrite(&contato,sizeof(agenda),1,tmp); //grava no arquivo temp        }    }....
Link para o comentário
Compartilhar em outros sites

@slackforgo

 

 

Pegando o seu exemplo, nem precisa daquelas flags:

.....fread(&contato,sizeof(agenda),1,arq);    while (!feof(arq))    {                if (strcmp(contato.nome,nome) != 0) //compara o nome, para exceder        {           fwrite(&contato,sizeof(agenda),1,tmp); //grava no arquivo temp        }        fread(&contato,sizeof(agenda),1,arq); //lê arquivo    }....

Ou seja, sempre que o nome for diferente do que encontra-se no registro lido, esse registro será gravado no arquivo temporário.

 

Lembre-se de fechar ambos os arquivos antes de renomear/remover. Falando nisso, acima eu havia dito para sobrescrever, mas é melhor fazer o seguinte: apague o arquivo original e depois renomeie o temporário para o nome original. Funções: remove()/rename().

 

Você poderá implementar umas melhorias, por exemplo, verificando de antemão se o registro a ser excluído encontra-se no banco; isso evitaria preencher todo um arquivo temporário à toa.

 

 

Futuramente, você poderá fazer uso de uma lista encadeada para ter mais flexibilidade com as operações básicas de manutenção de uma agenda, ordenação de registros, etc.

 

 

 

LNW

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!