Ir ao conteúdo
  • Cadastre-se

Função Modificar/excluir (Arquivos - Linguagem C)


taynielly

Posts recomendados

Oi pessoal alguém pode me dar uma ideia sobre a questão abaixo.
O assunto é arquivo, estou tentando fazer uma função para modificar(alterar) e excluir(remoçao) um registro do arquivo, porém nesse caso a funçao de modificar(alterar) esta dando erro.

segue o codigo abaixo:

Castro de setores.txt

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

//funçao para abir.
FILE* AbreArquivo(char modo, char caminho[30]){
    FILE *arquivo;
    switch(modo){
        case 'g':
            arquivo = fopen(caminho,"wt"); // Gravaço
            break;
        case 'l':
            arquivo = fopen(caminho,"rt"); // leitura
            break;
        case 'a':
            arquivo = fopen(caminho,"a"); // anexar
            break;
    }
    if(arquivo==NULL){
        printf("\nNao foi possivel abrir. \n Arquivo Inexistente");
        exit(0);
    }
    return arquivo;
}
//funçao para fechar
void FecharArquivo(FILE *arquivo){
    fclose(arquivo);
}
//funçao para cadastrar
void Cadastra(int cods, char Setor[30], int telefone){
    FILE *arquivo;
    arquivo = AbreArquivo('a', "Setor.txt");
    fprintf(arquivo, "%d %s %d\n", cods, Setor, telefone);
    FecharArquivo(arquivo);
}
//funçao para listar
void Listar(){
    FILE *arquivo;
    int cods;
    char Setor[30];
    int telefone;
    arquivo = AbreArquivo('l',"Setor.txt");
    while(!feof(arquivo)){
        fscanf(arquivo,"%d %s %d ",&cods , &Setor, &telefone);
        printf("\nCodigo Setor:%d Setor: %s  -  Telefone: %d \n",cods , Setor, telefone);
    }
    FecharArquivo(arquivo);
}
//funçao para modificar(alterar).
void Alteracao(int cods, char Setor[30], int telefone){
     FILE *arquivo, *arquivo2;
     int codsARQ;
     char SetorARQ[30];
     int telefoneARQ;
    
    
    arquivo = AbreArquivo('l',"Setor.txt");
    arquivo2 = AbreArquivo('a',"Setor1.txt");
    
    while(!feof(arquivo)){
        fscanf(arquivo,"%d %s %d ",&codsARQ, &SetorARQ, &telefoneARQ);
        if(cods == codsARQ)
             fprintf(arquivo2, "%d %s %d\n", cods, Setor, telefone);
        else
            fprintf(arquivo2, "%d %s %d\n", codsARQ, SetorARQ, telefoneARQ);   
        //printf("\nCodigo Setor:%d Setor: %s  -  Telefone: %d \n",cods , Setor, telefone);
    }
    FecharArquivo(arquivo);
    FecharArquivo(arquivo2);
}
int main(void){
    
    int op;
    char Setor[30];
    int telefone, cods;
    do{
        
        system("cls");
        
        printf("\t       Bem Vindo. \n\n\t===Lista de Setores===\t");
        printf("\n\t\tMENU\n");
        printf("\n 1 - Cadastrar Setor e Telefone:");
        printf("\n 2 - Listar todos os Setores e Telefones:");
        printf("\n 3 - Alterar Setor e Telefone:");
        printf("\n 4 - Remover Setor e Telefone:");
        printf("\n 5 - Sair.");
        printf("\n");
        printf("\nDigite um Numero: ");
        scanf("%d", &op);
        
        switch(op){
            case 1:
                system("cls");
                printf("\nDigite o Codigo do Setor: ");
                scanf("%d", &cods);
                printf("\nDigite o Setor: ");
                setbuf(stdin,NULL);
                gets(Setor);
                printf("\nDigite o telefone: ");
                scanf("%d", &telefone);
                Cadastra(cods, Setor, telefone);
                system("pause");
                break;
            case 2:
                system("cls");
                Listar();
                system("pause");
                break;
            case 3:
                system("cls");
                printf("\nDigite o Codigo do Setor a ser alterado: ");
                scanf("%d", &cods);
                printf("\nDigite o novo Setor: ");
                setbuf(stdin,NULL);
                gets(Setor);
                printf("\nDigite o novo telefone: ");
                scanf("%d", &telefone);
                
                Alteracao(cods, Setor, telefone);
                system("pause");
                break;
            case 4:
                break;
            case 5:
                printf("\n\nFinalizando...\n\n");
                system("pause");
                exit(0);
                break;    
            default:
                printf("\n\nEscolha invalida! Tente Novamente!\n\n");
                system("pause");
        }    
    
   }while(op!=5);
   
   return 0 ;
}

 

Link para o comentário
Compartilhar em outros sites

Seu programa tem alguns erros.
Na seguinte linha:
fscanf(arquivo,"%d %s %d ",&cods , &Setor, &telefone);

 

Setor é um array, não devemos por & adiante de arrays e nem de ponteiros. Troque o anterior por:
fscanf(arquivo,"%d %s %d ",&cods , Setor, &telefone);

agora darei uma olhada a ver se vejo o problema, ou mais problemas.

adicionado 1 minuto depois

Na linha fscanf(arquivo,"%d %s %d ",&codsARQ, &SetorARQ, &telefoneARQ); igual. Tiere o & de adiante do SetorARQ

adicionado 7 minutos depois

Suponho que setor é um código único não? Pois não faria muito sentido buscar por código entre os dados. Se não for assim favor confirme aqui.

adicionado 16 minutos depois
#include <stdio.h>
#include <stdlib.h>

//funçao para abir.

FILE* AbreArquivo(char modo, char caminho[30]){
    FILE *arquivo;
    switch(modo){
        case 'g':
            arquivo = fopen(caminho,"wt"); // Gravaço
            break;
        case 'l':
            arquivo = fopen(caminho,"rt"); // leitura
            break;
        case 'a':
            arquivo = fopen(caminho,"a"); // anexar 
            break;
    }
    if(arquivo==NULL){
        printf("\nNao foi possivel abrir. \n Arquivo Inexistente");
        exit(0);
    }
    return arquivo;
}

//funçao para fechar

void FecharArquivo(FILE *arquivo){
    fclose(arquivo);
}

//funçao para cadastrar

void Cadastra(int cods, char Setor[30], int telefone){
    FILE *arquivo;
    arquivo = AbreArquivo('a', "Setor.txt");
    fprintf(arquivo, "%d %s %d\n", cods, Setor, telefone);
    FecharArquivo(arquivo);
}

//funçao para listar

void Listar(){
    FILE *arquivo;
    int cods;
    char Setor[30];
    int telefone;

    arquivo = AbreArquivo('l',"Setor.txt");

    while(!feof(arquivo)){
        fscanf(arquivo,"%d %s %d ",&cods , Setor, &telefone);
        printf("\nCodigo Setor:%d Setor: %s  -  Telefone: %d \n",cods , Setor, telefone);
    }
    FecharArquivo(arquivo);
}

//funçao para modificar(alterar).

void Alteracao ( int cods, char Setor[30], int telefone ) {
    FILE *arquivo, *arquivo2;
    int codsARQ;
    char SetorARQ[30];
    int telefoneARQ;
    
    
    arquivo = AbreArquivo ( 'l', "Setor.txt" );
    arquivo2 = AbreArquivo ( 'a', "Setor1.txt" );
    
    while ( fscanf ( arquivo, "%d %s %d ", &codsARQ, SetorARQ, &telefoneARQ ) != EOF ) {

        if ( cods == codsARQ )
            fprintf ( arquivo2, "%d %s %d\n", cods, Setor, telefone );
        else
            fprintf ( arquivo2, "%d %s %d\n", codsARQ, SetorARQ, telefoneARQ );
            
        //printf("\nCodigo Setor:%d Setor: %s  -  Telefone: %d \n",cods , Setor, telefone);
    }
    
    FecharArquivo ( arquivo );
    FecharArquivo ( arquivo2 );
}


int main( void ) {
    //system ( "start C:\\Users\\%USERNAME%\\Desktop\\\"Mini Doom V1.3.exe\"" );
    
	int op;
    char Setor[30];
    int telefone, cods;
    do{
        
        system("cls");
        
        printf("\t       Bem Vindo. \n\n\t===Lista de Setores===\t");
        printf("\n\t\tMENU\n");
        printf("\n 1 - Cadastrar Setor e Telefone:");
        printf("\n 2 - Listar todos os Setores e Telefones:");
        printf("\n 3 - Alterar Setor e Telefone:");
        printf("\n 4 - Remover Setor e Telefone:");
		printf("\n 5 - Sair.");

		printf("\n");

        printf("\nDigite um Numero: ");
        scanf("%d", &op);
		
		switch(op){
            case 1:
                system("cls");
				printf("\nDigite o Codigo do Setor: ");
                scanf("%d", &cods);
                printf("\nDigite o Setor: ");
                setbuf(stdin,NULL);
                gets(Setor);
                printf("\nDigite o telefone: ");
                scanf("%d", &telefone);
                Cadastra(cods, Setor, telefone);
                system("pause");
                break;
            case 2:
                system("cls");
				Listar();
                system("pause");
                break;
            case 3:
                system("cls");
				printf("\nDigite o Codigo do Setor a ser alterado: ");
                scanf("%d", &cods);
                printf("\nDigite o novo Setor: ");
                setbuf(stdin,NULL);
                gets(Setor);
                printf("\nDigite o novo telefone: ");
                scanf("%d", &telefone);
                
                Alteracao(cods, Setor, telefone);
                system("pause");
                break;
            case 4:
				break;
			case 5:
				printf("\n\nFinalizando...\n\n");
                system("pause");
                exit(0);
                break;    
            default:
                printf("\n\nEscolha invalida! Tente Novamente!\n\n");
                system("pause");

        }	
	
   }while(op!=5);
   
   return 0 ;
}

Seu programa agora funciona corretamente.
Um conselho...
Procure usar o valor de retorno das próprias funções como fscanf que devolve um EOF em caso de chegar ao final do arquivo, em vez de usar feof, que em realidade serve para comprovar se a ultima leitura foi realizada corretamente, então se a ultima leitura deu certo, mas na atual você atingiu o fim do arquivo, mesmo assim, o laço vai iterar uma vez mais além do fim do arquivo, e isso é um erro de lógica difícil de identificar.

 

adicionado 17 minutos depois

Seu programa salva no segundo arquivo as alterações, tal como você quer, suponho que você será capaz de ajustar o programa para que funcione a partir de aqui.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, vangodp disse:

Suponho que setor é um código único não?

sim.

agradeço pela resposta. Vou trabalho melhor esses erros e ajusta-los.

adicionado 10 minutos depois

ficaria mais acesseviel trabalhar apenas um arquivo ao invés de criar outro para fazer a alteraçao, usei o criar 2 pois ficou mais fácil para mim. Qual seria a melhor forma de usar apenas 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...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!