Ir ao conteúdo
  • Cadastre-se

C Lista ordenado em um arquivo


Jederson Yago

Posts recomendados

Opa galera de boas? 

então estou fazendo um algoritmo onde preciso listar de um arquivo só que sendo ordenado, listar eu consigo de boa mas ordenado não sei, alguem pode me ajudar? 

o codigo vai ai.

são as funções de inserir e listar normal mesmo, alguem ajuda 😕

//Função para inserir os dados 
void InserirContato(){
	FILE* arq;
	CONTATO ctt;

	
	arq = fopen("agenda.txt","a");
	if(arq == NULL){
		printf("Erro na abertura do arquivo!\n");
		exit(1);
	}
	else
	{
	 	   	fflush(stdin);
			printf("Digite o nome: ");
			gets(ctt.nome);
			fflush(stdin);
			printf("Digite o telefone: ");
			gets(ctt.fone);
			fflush(stdin);
			printf("Digite sua cor: ");
			gets(ctt.cor);
			printf("Digite seu aniversario: ");
			scanf("%d %d %d", &ctt.aniv.dia, &ctt.aniv.mes, &ctt.aniv.ano);
			
			fwrite(&ctt, sizeof(CONTATO),1,arq);
		}
			fclose(arq);
	}

//Função que lista todos os contatos cadastrados	
void ListarContato(){
	FILE* arq;
	CONTATO ctt;
	
	arq = fopen("agenda.txt","r");
	if(arq == NULL){
		printf("Erro na abertura do arquivo!\n");
		exit(1);
	}
	else
	{
		while(fread(&ctt,sizeof(CONTATO),1,arq) == 1){
				printf("-----------------------------------------------\n");
				printf("\nNome: %s\n", ctt.nome);
				printf("Telefone: %s\n", ctt.fone);
				printf("Cor: %s\n", ctt.cor);
				printf("Aniversario: %d/%d/%d\n", ctt.aniv.dia, ctt.aniv.mes, ctt.aniv.ano);
				printf("-----------------------------------------------\n");
		}
	}
	fclose(arq);
	getchar();
}

 

Link para o comentário
Compartilhar em outros sites

Olá@Jederson Yago , acredito que para ordena os dados é preciso tê-los na memória, todos eles.

 

Crie lista com todos os dados, aplique a ordenação nessa lista. 

Por fim, salve em um novo arquivo de disco a lista ordenada e quando tudo terminar exclua o arquivo anterior.

 

Entendi que seu código grava novos contados direto no disco usando a função fwrite, acredito que aplicar uma ordenação usando essa mesma técnica seja mais trabalhoso, melhor mesmo manipular na memória com estrutura de dados List.

 

Certo!

Link para o comentário
Compartilhar em outros sites

@Jederson Yago só aprendeu assim, eu disse que é mais trabalhoso, porém pode ser que para você não seja.

 

Então a ideia a seguinte, com arquivo aberto (leitura e gravação) você terá que se mover para cima e para baixo como se fosse um vetor. A função fseek vai ajudar na movimentação do indicador de posição. Você vai realizando as trocas como se tivesse no vetor mesmo sobrescrevendo dados.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Realmente, fazer ordenação diretamente dentro do arquivo é muito trabalhoso e ineficiente, faz muito mais sentido colocar todos os contatos em um vetor na memória, ordenar o vetor, e no fim escrever todos os contatos ordenados no arquivo novamente.

 

Você deve criar um vetor com tipo CONTATO (dependendo da quantidade aloca dinamicamente), e ao invés de ler apenas 1 contato no fread você lê todos os contatos do arquivo de uma vez e guarda nesse vetor. Aí pode usar um algoritmo de ordenação para ordenar os dados no vetor.

Link para o comentário
Compartilhar em outros sites

A quantidade de contatos no arquivo é igual ao tamanho/comprimento do arquivo dividido pelo tamanho/comprimento de 1 contato:

fseek(arq, 0, SEEK_END); //Vai para o fim do arquivo
size_t quantidadedecontatos = ftell(arq) / sizeof(CONTATO);
rewind(arq); //Volta para o inicio do arquivo

 

Aloca o vetor:

CONTATO *cttv = malloc(quantidadedecontatos * sizeof *cttv);

Ler todos os contatos e guardar no vetor:

fread(cttv,sizeof(CONTATO),quantidadedecontatos,arq);

Acessa os dados de cada contato usando seu respectivo índice:

cttv[0].nome
cttv[0].fone
...etc...

 

Aí usa algum algoritmo de ordenação para ordenar os dados no vetor (Insertion Sort, Bubble Sort, Selection Sort, etc).

 

 

E é basicamente a mesma coisa para escrever todos os dados do vetor no arquivo (lembre-se que nesse caso deve abrir o arquivo em modo de escrita).

fwrite(cttv,sizeof(CONTATO),quantidadedecontatos,arq);

 

E não pode esquecer de liberar a memória alocada dinamicamente para o vetor quando não precisa mais dele:

free(cttv);

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...