How to remove a struct stored in c file?

Asked

Viewed 1,586 times

2

I don’t think I explained it well in the title

I have a schedule code where I can add contact, edit, list and is stored in a calendar file.txt

only that I’m having trouble removing a contact that was previously added

Code:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>


struct usuario{
    int num;    
    char nome[50];  
    char telefone[20];
    char email[20]; 
    char endere[20];
};

FILE *arquivo;

struct usuario C;

// Função que exibe o menu de opções
char menu(){

    system("cls");
    printf("\n- - - - - - - - AGENDA DE CONTATOS - - - - - - - -\n\n");

    printf("Opcoes:\n");
    printf("1 - Cadastrar contato.\n");
    printf("2 - Listar contatos cadastrados.\n");
    printf("3 - Procurar contato. \n");
    printf("4 - Editar contato.\n");
    printf("5 - Excluir contato.\n");
    printf("6 - Sair.\n\n");
    printf("Digite a opcao:");

    return (getche());
}

// Função de pesquisa pelo número de inscrição
int BuscaInsc(int n){
    fread(&C,sizeof(C),1,arquivo);

    while(!feof(arquivo)){      
        if(C.num == n){     
            fseek(arquivo,sizeof(C),SEEK_CUR);      
            return 1;       
        }       
    fread(&C,sizeof(C),1,arquivo);  
    }   
    return 0;
}

// Função de cadastro de usuário
void cadastrarUsuario(){    
    int i;  
    arquivo = fopen("agenda.txt","a+b");

    if(arquivo == NULL){
        printf("Erro ao abrir arquivo\n");
        return;
    }

    printf("\n\n\nDigite o codigo de inscricao: "); 
    scanf("%d",&C.num);

    if(C.num != 0){ 
        printf("\nDigite o nome: ");    
        fflush(stdin);  
        gets(C.nome);   
        printf("\nDigite o telefone: ");    
        fflush(stdin);  
        gets(C.telefone);
        printf("\nDigite o e-mail: ");  
        fflush(stdin);  
        gets(C.email);  
        printf("\nDigite o endereco: ");    
        fflush(stdin);  
        gets(C.endere); 
        fwrite(&C,sizeof(C),1,arquivo); 
        getchar();
    }

    else{
        printf("\nCodigo de inscricao ja cadastrado.\n");   
    }
    fclose(arquivo);

}

// Função que lista usuários cadastrados
void listarUsuario(){   
    int i=0;    
    arquivo = fopen("cliente.txt","rw");

    if(arquivo == NULL){    
        printf("\nErro ao abrir arquivo\n");    
        return; 
    }

    fread(&C,sizeof(C),1,arquivo);  
    printf("\n\n\nCadastros:\n\n\n");

    while(!feof(arquivo)){  
        i++;    
        printf("\n- - - - - - - - AGENDA - - - - - - - -"); 
        printf("\n____________________________________\n\n");   
        printf("Codigo de inscricao: %d\n Nome: %s\n Telefone: %s\n E-mail: %s\n Endereco: %s\n"    
        ,C.num,C.nome,C.telefone,C.email,C.endere);     
        printf("\n____________________________________\n\n");

        fread(&C,sizeof(C),1,arquivo);  

        if(feof(arquivo) || (i == 20)){
            break;  
            getchar();  
            getchar();  
        }
    }
    fclose(arquivo);

}

// Função que busca usuário pelo código
void buscarUsuario(){
    int insc;
    arquivo = fopen("agenda.txt","rw");

    if(arquivo == NULL){
        printf("\nErro ao abrir o arquivo\n");
    }

    printf("\n");
    printf("\n Digite o codigo de inscricao: ");
    scanf("%d",&insc);

    if(BuscaInsc(insc) == 0)
        printf("\nCodigo de Inscricao invalido!\n");
    else {
        fread(&C,sizeof(C),1,arquivo);
        printf("\n- - - - - - - - AGENDA - - - - - - - -\n");
        printf("\n____________________________________\n\n");
        printf("\nInscricao: %d\n",C.num);
        printf("Nome: %s\n",C.nome);
        printf("Telefone: %s\n",C.telefone);
        printf("E-mail: %s\n",C.email);
        printf("Endereco:%s\n",C.endere);
        printf("\n____________________________________\n\n");

        getchar();
        getchar();
    }

    fclose(arquivo);

}

// Função de edição de usuário
void editarUsuario()
{
    int insc;
    arquivo = fopen("agenda.txt","rw");
    if(arquivo == NULL){
        printf("\nErro ao abrir o arquivo\n");
    }
    printf("\n");
    printf("\n Digite o codigo de inscricao: ");
    scanf("%d",&insc);

    //BuscaInsc(insc);

    if(BuscaInsc(insc) == 0)
        printf("\nCodigo de inscricao invalido!\n");
    else
        arquivo = fopen("agenda.txt","wb");

    if(arquivo == NULL){
        printf("Erro ao abrir arquivo\n");
        return;
    }

    printf("\n\nInscricao: ");
    scanf("%d",&C.num);

    if(C.num !=0){
        printf("\nNome: ");
        fflush(stdin);
        gets(C.nome);
        printf("\nDigite o telefone: ");
        fflush(stdin);
        gets(C.telefone);
        printf("\nDigite o e-mail: ");
        fflush(stdin);
        gets(C.email);
        printf("\nDigite o endereco: ");
        fflush(stdin);
        gets(C.endere);
        printf("\nAlteracao realizada com sucesso!");
        fwrite(&C,sizeof(C),1,arquivo);
        getchar();
    }

    else
        printf("\nCodigo de inscricao ja cadastrado.\n");
    fclose(arquivo);

}


// Função de edição de usuário
void apagarUsuario()
{



}


// Função principal
main(){
    char op;
    while(op!='6'){
        op = menu();
        switch(op){
            case '1':cadastrarUsuario();
            break;

            case '2':listarUsuario();
            break;

            case '3':buscarUsuario();
            break;

            case '4':editarUsuario();
            break;

            case '5':apagarUsuario();
            break;
        }
        printf("\n");
        system("pause");
    }

}
  • Friend, I am not an expert in Structs, but struct user c, it is only a single user, I believe that you can not enter several values, IE, only one person, if you want others I think should have other users, or otherwise use a chained list.. I’m sorry if I screwed up..

1 answer

0

A good way to do this would be to create a new file. Copy all contacts to the new file, except the one you want to delete. And in the end, remove the old file and rename the new.

void apagarUsuario()
{
    FILE* arquivo = fopen("agenda.txt", "rw");
    FILE* novoArquivo = fopen("temp.txt", "w");
    char nome[50];

    printf("Digite o nome do usuário a ser excluido: ");
    scanf("%s", nome);

    while(!feof(arquivo)){
        fread(&C, sizeof(C), 1, arquivo);
        if(strcmp(nome, C.nome)){
            fwrite(&C, sizeof(C), 1, novoArquivo);
        }
    }
    fclose(novoArquivo);
    fclose(arquivo);
    remove("agenda.txt");
    rename("temp.txt", "agenda.txt");
}
  • very grateful for the strength, colleague

  • 1

    In addition to this possibility you can include in your structure a field stating whether that record is valid or should be considered deleted (logical exclusion). In this case you should modify your inclusion routine by searching first if there is any logical exclusion and, if there is, occupy the available space.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.