Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Pacheco

Excluir registro em arquivo - c

Recommended Posts

Nó código abaixo tem-se duas funcões uma que busca o código do cliente e a outra que exclui um registro de um cliente de uma determinada posição.A minha dúvida é como fazer uma outra função de excluir cliente só que excluindo um registro de um vetor num arquivo?

 

 

 



// Busca por código
int busca_codigocli(cliente clien[]){
    int cont=0,cod;

	    printf("\nEntre com o codigo\n");
        scanf("%d",&cod);

	while(cont<=50) {
		if(clien[cont].codigo==cod){
			return cont;
		}
		else{
			cont++;
		}
    }
	return -1;                    
}



//Excluir Cliente


void excluir_cliente(cliente clien[],int *indice) {
int cod, cont=0,y;
//printf("\nEntre com o codigo do registro que deseja excluir\n");
//scanf("%d",&cod);

y=busca_codigocli(clien);

	if (y==-1) 
		printf("\nCodigo nao encontrado\n\t");
	else{
		 for (cont=y+1;cont<*indice+1;cont++) {//1 ao 50
		     clien[cont-1].codigo=clien[cont].codigo; 

//O registro da posicao anterior  do vetor é sobrescrito com o proximo registro da próxima posição.(ex. pos 0 é substituido pela pos 1);


			
		}
		printf("\nExclusao feita com sucesso\n\t");
		*indice=*indice-1;
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi. Você quer dispensar o array de clientes da memória e mexer só com operação de I/O em arquivos?

Não é uma escolha muito boa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se por arquivos binários você entende 'arquivos que só podem ser "entendidos" pela aplicação' (a.k.a "um monte de bits sem significado"), o que muda é só uma letra "b" na abertura do fopen. Que, por sinal, é ignorada nos sistemas POSIX.

 

Se é p/ mudar o conteúdo do arquivo diretamente, mapeie tudo em memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o que eu fiz eu nao mexi com arquivo. Será que voces podem me dar um exemplo pelo menos de uma função que vai excluir a posição de um vetor de registro só que em arquivo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

para remover conteúdo de arquivos, você deve reescrevê-lo, sem a parte que será removida, claro.

se a intenção é remover bytes do fim do arquivo, há a opção de usar a syscall truncate().

 

veja as funções fread, fwrite e fseek.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá bom eu tenho duas funções uma que exclui um registro de um vetor e outra que consulta o registro que se quer excluir do vetor. Tudo isso em arquivo.

 

O que eu quero saber é o seguinte se eu quisesse nessas funções ao invés de fazer um vetor de registro fazer uma matriz de registro o que mudaria entao nessas duas funções abaixo?

 

 

 

 

// Função Exclui um registro do arquivo
// Retorna:
// 
//1 se o registro foi excluído com sucesso
// 
//0 se o registro não pode ser excluído
//

Exclui_registro(FILE *arquivo, Registro registro)
{
  int posicao;

   if(arquivo != NULL){
       posicao = Consulta_registro(arquivo, registro);
       if(posicao != -1)
     {

     fseek(arquivo, posicao*sizeof(registro), SEEK_SET);
     registro.excluido = 1;
     if(fwrite(&registro, sizeof(registro), 1, arquivo))
        return 1;
     }

   }
   return 0;
}


// Função que consulta um registro do arquivo
// Retorna a posição física onde o registro foi encontrado ou
// -1 caso o registro não tenha sido encontrado
//
Consulta_registro(FILE *arquivo, Registro registro)
{
   Registro registro_lido;
   int posicao;

  if(arquivo != NULL)
  {
   fseek(arquivo, 0L, SEEK_SET);
   posicao = 0;
   // repete enquanto nao chega ao final do arquivo 
   while(fread(&registro_lido, sizeof(registro_lido), 1,  arquivo))
   {
   if(strcmpi(registro_lido.nome, registro.nome)==0 &&     (registro_lido.excluido == 0))
   return posicao;
   posicao++;
   };
  }
  return -1;
}


Compartilhar este post


Link para o post
Compartilhar em outros sites
É o que eu fiz eu nao mexi com arquivo.

 

Mapear em memória não é abrir com fopen e usar o resto das funções de arquivo. Nos sistemas que implementam o POSIX, p/ mapear um arquivo em memória você tem que usar mmap depois de abrir um arquivo com fopen. A vantagem é que tudo vira uma string gigante e você pode procurar as coisas usando expressões regulares, ao invés de ficar catando byte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.