Ir para conteúdo

POWERED BY:

Arquivado

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

juniorneo2

Excluir objeto de uma arquivo (.dat)

Recommended Posts

E ai pessoal do imasters, estou com um probleminha, tenho um objeto, este objeto eu gravo e leio de um arquivo (.data), minha duvida seria como excluir este

objeto desse arquivo, ai vai um exemplo:

 

//leio desta maneira

 void main() {
   ifstream arq("futebol.dat");
   Times ti;
   while(arq.read((char *)&ti, sizeof(Times)))
		ti.print();
 }

// gravo desta maneira
 
void main() {
   ofstream arq("futebol.dat");
   Times ti;
   do{
		 ti.add();
		arq.write(((char *)&ti, sizeof(Times));
		cout<< "\nMais um time (s/n)";
	   } while(getche() != 'n');

   }

A minha duvida seria como deletar um objeto que se encontra nesse arquivo, vlw pessoal http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

No meu entendimento você terá que sempre remontar o arquivo.

 

Ou colocar um FLAG, dizendo se o item está excluido ou não!

 

//a partir do item excluido regravar os itens posteriores, setando o tamanho do arquivo ao final!

 

Ok!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este flag seria mais ou menos assim, um atributo desse objeto, quando estiver (0) estar excluido e quando estiver (1) estar ativo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Remontar o arquivo seria o ideal, mas além de trabalhoso é um processo que pode demorar dependendo do tamanho do arquivo.

Como o amigo acima citou voce pode usar uma flag que indique se aquele registro está ativo ou não.

Quando precisar encontrar um registro procure sempre pelos ativos.

 

Outra idéia é substituir o pedaco do arquivo referente a um objeto por um outro objeto "zerado".

Nesse processo voce deve identificar o objeto a ser removido, voltar o ponteiro FILE no tamanho de um objeto e substituir esse por um objeto "zerado". Vou por um trecho de código em C para exemplificar:

 

// registro a ser removido foi identificado
		{
			strcpy(reg.nome,""); // "zera" o objeto
			strcpy(reg.end,"");
			strcpy(reg.tel,"");

			fseek(fp,-1*sizeof(struct cadastro),SEEK_CUR); // volta o ponteiro para o arquivo no tamanho de um registro
			fwrite(®,sizeof(struct cadastro),1,fp); // sobreescreve o objeto
		}

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.