• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

bushin

apagar dados de um ficheiro binario !!

7 mensagens neste tópico

Não esta a funcionar ... e nao encontro o problema!!

void limpar_fichas(void)
/* Função que, através da pesquisa sequencial do nome, limpa uma ficha do ficheiro. 
Para isso, vai passando cada uma das fichas para um novo ficheiro, até à altura em
que encontra o nome procurado. Nessa altura, apenas gravará essa ficha no novo ficheiro, se 
o utilizador não confirmar o apagar da ficha. No final, apaga o analise.dat e troca os nomes dos 
ficheiros de forma a que o novo ficheiro fique novamente com o nome de analise.dat. */
{
char opcao2;
int encontrou=0;
char nome_proc[40];
FILE *pf,*fich_aux;

EMPRESA aux;




go2xy(3,27);printf("APAGA FICHA  ");SetColor(WHITE);	//titulo

go2xy(10, 2);

printf(" NOME A PROCURAR: ");gets(nome_proc);
        fflush(stdin);


pf=fopen("analise.dat","rb");

if(!pf) 
{
	printf("Erro na abertura do ficheiro %s ! \n\n","pessoas.dat");
	exit(1);
}

fich_aux=fopen("analise_1.dat","wb");

if(!fich_aux) 
{
	printf("Erro na abertura do ficheiro %s ! \n\n","analise_1.dat");
	exit(1); 
}


while (fread(&aux,sizeof(EMPRESA),1,pf)!=0)
{
	if (strcmp(aux.nome_empresa,nome_proc)==0)
	{
		encontrou=1;
		printf(" Encontrou a ficha procurada !\n\n");
		apresenta_dados(aux);

		printf("\n Tem a certeza que quer apagar esta ficha (S/N) ? ");
		opcao2=getch();
		if ((opcao2=='N')||(opcao2=='n'))
			fwrite(&aux,sizeof(EMPRESA),1,fich_aux);
		else
		{
			printf("\n\n\n => A FICHA FOI APAGADA ! ");
			--numero_est; // O número de registos usado é decrementado de um
		}
	}
	else fwrite(&aux,sizeof(EMPRESA),1,fich_aux);
}

if (!encontrou)
	printf(" Nao encontrou a ficha procurada !\n\n");


printf("\n\n Carregue numa tecla para continuar ... ");
getch();

fclose(pf);
fclose(fich_aux);	
remove("analise.dat"); // Apaga o ficheiro "analise.dat" e …
rename("analise.dat","analise_1.dat"); // troca o nome de "analise_1.dat" por "analise.dat"



printf("\n\n\t\tcarregue numa tecla para continuar ... \n\n");
getch();

system("cls");
menu_1();
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exactamente o que é que não está a funcionar? Mostra aí a struct EMPRESA.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta é a estrutura e a funçao para apresentar os dados...

typedef struct struct_empresa{
char nome_empresa[40];
int estado;
int nif;
unsigned int processo;
data registo;
float liq_g;
float liq_r;
float liq_i;
float autonomia_f;
float endividamento;
float divida_liq;
float divida_rend;
}EMPRESA;


void apresenta_dados(EMPRESA proc_aux){ 



printf("\t------------------------------------------------------\n");
printf("\t %d =>NIF:%d  Empresa: %s	 Data: %d /%d / %d \n",proc_aux.processo,proc_aux.nif,proc_aux.nome_empresa,proc_aux.registo.dia,proc_aux.registo.mes,proc_aux.registo.ano);
printf("\t------------------------------------------------------\n\n\n");


printf("\t> Racios de Liquidez \n");

printf("\t\t%c Liquidez Geral %.1f\n",254,proc_aux.liq_g);
printf("\t\t%c Liquidez Reduzida: %.1f\n",254,proc_aux.liq_r);
printf("\t\t%c Liquidez Imediata: %.1f\n\n",254,proc_aux.liq_i);


printf("\t> Autonomia Finaceira \n");
printf("\t\tAutonomia Finaceira: %.1f\n\n",proc_aux.autonomia_f);


printf("\t> Estrutura de Endividamento \n");

printf("\t\tEndividamento: %.1f\n",proc_aux.endividamento);
printf("\t\tDivida Liquida: %.1f\n",proc_aux.divida_liq);
printf("\t\tDivida do Rendimento:%.1f\n\n",proc_aux.divida_rend);

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o problema do programa é que ele copia a informação do ficheiro analise.dat para o novo ficheiro analise_1.dat menos a ficha que eu queria apagar, mas qdo eu faço uma consulta de uma outra ficha quaisquer nao aparece nada pois a função que utilizo para pesquisar esta a utilizar o ficheiro analise.dat; tioricamente deveria funcionar pois utilizo  rename("analise.dat","analise_1.dat");. :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens os nomes dos ficheiros ao contrário. Tens que fazer rename("analise_1.dat","analise.dat");, que é como quem diz, rename(from, to);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora