Ir ao conteúdo

Dúvida arquivos!


Visitante

Posts recomendados

Postado

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;}
Postado

@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

Postado

@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        }    }....
Postado

@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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!