Ir ao conteúdo
  • Cadastre-se

busca no arquivo não funciona


Gabriel_Moro

Posts recomendados

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

typedef struct musica {
	char cd[20];
} MUSICA;

void insere(FILE *f, MUSICA novo) {
	fprintf(f, "%s\n", novo.cd);
}

MUSICA *buscaCD(FILE *f, char cd[20]) {
	MUSICA *m = malloc(sizeof(MUSICA));
	fseek(f, SEEK_SET, 0);
	while (!feof(f)) {
		fread(m, sizeof(MUSICA), 1, f);
		if (strcmp(m->cd, cd) == 0)
			return m;
	}
	return NULL;
}

void altera(FILE *f, char busca[20], MUSICA alterado) {
	int ok = 0;
	MUSICA *m = malloc(sizeof(MUSICA));
	fseek(f, SEEK_SET, 0);
	while (!feof(f) && ok == 0) {
		fread(m, sizeof(MUSICA), 1, f);
		if (!strcmp(m->cd, busca)) {
			ok = 1;
			fwrite(m, sizeof(MUSICA), 1, f);
			fclose(f);
		}
	}
}

int main() {
	FILE *f = fopen("arq.txt", "w+");
	MUSICA novo;
	MUSICA *busca;
	strcpy(novo.cd, "CD 123");
	insere(f, novo);
	strcpy(novo.cd, "CD 456");
	insere(f, novo);
	strcpy(novo.cd, "CD 789");
	insere(f, novo);

	rewind(f);
	char procura[20];

	strcpy(procura, "CD 123");
	busca = buscaCD(f, procura);
	if (busca != NULL) {
		printf("Achou: %s", busca->cd);
	} else {
		printf("Não achou!");
	}

	busca = buscaCD(f, "CD 111");
	if (busca != NULL) {
		printf("\nAchou: %s", busca->cd);
	} else {
		printf("\nNão achou!");
	}

	rewind(f);
	strcpy(procura, "CD 123");
	strcpy(novo.cd, "CD 666");
	altera(f, procura, novo);

	fclose(f);
	return 0;
}

não estou conseguindo buscar um dado no arquivo

Link para o comentário
Compartilhar em outros sites

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

typedef struct musica {
	char cd[20];
	int excluido;
} MUSICA;

void insere(FILE *f, MUSICA novo) {
	fprintf(f, "%s\n", novo.cd);
	fprintf(f, "%d\n", novo.excluido);

}

MUSICA *buscaCD(FILE *f, char cd[20], long *checkPoint, long *checkPoint2) {
	MUSICA *m = malloc(sizeof(MUSICA));
	fseek(f, SEEK_SET, 0);
	while (!feof(f)) {
		*checkPoint = ftell(f);
		fscanf(f, "%19[^\n]%*c", m->cd);
		*checkPoint2 = ftell(f);
		fscanf(f, "%d", &m->excluido);
		if (strcmp(m->cd, cd) == 0)
			return m;
	}
	return NULL;
}

void altera(FILE *f, char busca[20], MUSICA alterado) {
	MUSICA *m;
	long checkPoint, checkPoint2;
	m = buscaCD(f, busca, &checkPoint, &checkPoint2);
	fseek(f, checkPoint, 0);
	if (m != NULL) {
		fprintf(f, "%s\n", alterado.cd);
		fprintf(f, "%d\n", alterado.excluido);
		printf("\nRegistro alterado!");
	} else
		printf("\nRegistro inexistente!");
}

void exclui(FILE *f, char busca[20]) {
	MUSICA *m;
	long checkPoint, checkPoint2;
	m = buscaCD(f, busca, &checkPoint, &checkPoint2);
	fseek(f, checkPoint2, 0);
	if (m != NULL && m->excluido == 0) {
		fprintf(f, "%d\n", 1);
		printf("\nRegistro apagado!");
	} else
		printf("\nRegistro inexistente!");
}

void reorganiza(FILE *f) {
	MUSICA m;
	FILE *g = fopen("auxx.txt", "w+");
	fseek(f, SEEK_SET, 0);
	while (!feof(f)) {
		fscanf(f, "%19[^\n]%*c", m.cd);
		fscanf(f, "%d", &m.excluido);
		if (m.excluido == 0) {
			fprintf(g, "%s\n", m.cd);
			fprintf(g, "%d\n", m.excluido);
		}
	}
	fclose(g);
}

int main() {
	FILE *f = fopen("arq.txt", "w+");
	MUSICA novo;
	MUSICA *busca;
	strcpy(novo.cd, "CD 123");
	novo.excluido = 0;
	insere(f, novo);
	strcpy(novo.cd, "CD 456");
	novo.excluido = 0;
	insere(f, novo);
	strcpy(novo.cd, "CD 789");
	novo.excluido = 0;
	insere(f, novo);

	long checkPoint, checkPoint2;

	busca = buscaCD(f, "CD 123", &checkPoint, &checkPoint2);
	if (busca != NULL) {
		printf("Achou: %s", busca->cd);
	} else {
		printf("Não achou!");
	}

	busca = buscaCD(f, "CD 111", &checkPoint, &checkPoint2);
	if (busca != NULL) {
		printf("\nAchou: %s", busca->cd);
	} else {
		printf("\nNão achou!");
	}

	strcpy(novo.cd, "CD 666");
	novo.excluido = 0;
	altera(f, "CD 123", novo);

	strcpy(novo.cd, "CD 777");
	novo.excluido = 0;
	altera(f, "CD 111", novo);

	exclui(f, "CD 456");

	exclui(f, "CD 456");

	reorganiza(f);

	fclose(f);
	return 0;
}

criei um função de exclusão que só marca quando um item foi excluído e uma função pra reorganizar, que tira os dados excluidos, que esta duplicando os dados, o que poderia ser?

Link para o comentário
Compartilhar em outros sites

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

typedef struct musica {
	char cd[20];
	int excluido;
} MUSICA;

void insere(FILE *f, MUSICA novo) {
	fwrite(&novo, sizeof(MUSICA), 1, f);
}

MUSICA *buscaCD(FILE *f, char cd[20], long *checkPoint) {
	MUSICA *m = malloc(sizeof(MUSICA));
	fseek(f, SEEK_SET, 0);
	while (1) {
		*checkPoint = ftell(f);
		fread(m, sizeof(MUSICA), 1, f);
		if (feof(f))
			break;
		if (strcmp(m->cd, cd) == 0)
			return m;
	}
	return NULL;
}

void altera(FILE *f, char busca[20], MUSICA alterado) {
	MUSICA *m;
	long checkPoint;
	m = buscaCD(f, busca, &checkPoint);
	fseek(f, checkPoint, 0);
	if (m != NULL) {
		fwrite(&alterado, sizeof(MUSICA), 1, f);
		printf("\nRegistro alterado!");
	} else
		printf("\nRegistro inexistente!");
}

void exclui(FILE *f, char busca[20]) {
	MUSICA *m;
	long checkPoint;
	m = buscaCD(f, busca, &checkPoint);
	fseek(f, checkPoint, 0);
	if (m != NULL && m->excluido == 0) {
		m->excluido=1;
		fwrite(m, sizeof(MUSICA), 1, f);
		printf("\nRegistro apagado!");
	} else
		printf("\nRegistro inexistente!");
}

void reorganiza(FILE *f) {
	MUSICA m;
	FILE *g = fopen("auxx.txt", "wb+");
	fseek(f, SEEK_SET, 0);
	while (1) {
		fread(&m, sizeof(MUSICA), 1, f);
		if (feof(f))
			break;
		if (m.excluido == 0) {
			fwrite(&m, sizeof(MUSICA), 1, g);
		}
	}
	fclose(g);
}

void mostra(FILE *f) {
	MUSICA m;
	fseek(f, SEEK_SET, 0);
	printf("\n");
	while (1) {
		fread(&m, sizeof(MUSICA), 1, f);
		if (feof(f))
			break;
		if (m.excluido != 1)
			printf("CD: %s\n", m.cd);
	}
}

int main() {
	FILE *f = fopen("arq.txt", "wb+");
	MUSICA novo;
	MUSICA *busca;
	strcpy(novo.cd, "CD 123");
	novo.excluido = 0;
	insere(f, novo);
	strcpy(novo.cd, "CD 456");
	novo.excluido = 0;
	insere(f, novo);
	strcpy(novo.cd, "CD 789");
	novo.excluido = 0;
	insere(f, novo);

	long checkPoint;

	busca = buscaCD(f, "CD 123", &checkPoint);
	if (busca != NULL) {
		printf("Achou: %s", busca->cd);
	} else {
		printf("Não achou!");
	}

	busca = buscaCD(f, "CD 111", &checkPoint);
	if (busca != NULL) {
		printf("\nAchou: %s", busca->cd);
	} else {
		printf("\nNão achou!");
	}

	mostra(f);

	strcpy(novo.cd, "CD 666");
	novo.excluido = 0;
	altera(f, "CD 123", novo);

	strcpy(novo.cd, "CD 777");
	novo.excluido = 0;
	altera(f, "CD 111", novo);

	mostra(f);

	exclui(f, "CD 456");

	exclui(f, "CD 456");

	mostra(f);

	reorganiza(f);

	fclose(f);

	remove("arq.txt");
	rename("auxx.txt", "arq.txt");

	f=fopen("arq.txt", "rb");
	mostra(f);
	fclose(f);

	return 0;
}

arrumei o código para um arquivo binário, da uma olhada pra ver se esta tudo ok ou poderia melhorar alguma coisa

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!