Ir ao conteúdo
  • Cadastre-se
ira_titanica

C Alterar dado de uma struct no arquvio em C

Recommended Posts

Olá. Estou tendo um problema para alterar determinado dado de um cadastro. Quando altero o valor de 1 para 0 ou vice versa, o programa não sobrescreve o cadastro, mas cria um novo cadastro. O que estou fazendo de errado? Obrigado.

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

typedef struct estrutura
{
	char nome[30];
	char endereco[30];
	char tipo_pedido[15];
	char nome_pedido[30];
	char dia_do_pagamento[3];
	float preco_total;
	float preco_restante;
	int status;
	int ID;
}cadastro;
cadastro cliente;

int insere_cliente();
int remove_cliente();
int altera_cliente();
int mostra_cliente();
int zera_arquivo();

FILE *arq;

int main()
{
	int escolha = 0, decisão = 0, erro = 0;

	arq = fopen("cliente.dat", "a+b");

	while (escolha != 6)
	{
		system("cls");
		printf("1->Inserir clientes\n");
		printf("2->Alterar clientes\n");
		printf("3->Remover ou reativar clientes\n");
		printf("4->Mostrar clientes\n");
		printf("5->Apagar todos os clientes do arquivo\n");
		printf("6->Sair\n:");
		scanf("%d", &escolha);
		if (escolha == 1)
		{
			setbuf(stdin, NULL);
			erro = insere_cliente();
		}
		else if (escolha == 3)
		{
			setbuf(stdin, NULL);
			erro = remove_cliente();
		}
		else if (escolha == 4)
		{
			setbuf(stdin, NULL);
			erro = mostra_cliente();
		}
		else if (escolha == 5)
		{
			setbuf(stdin, NULL);
			erro = zera_arquivo();
		}
	}
	fclose(arq);
	return 0;
}

int insere_cliente()
{
	int escolha = 0, id = 0, tamanho = 0;

	fseek(arq, 0, SEEK_END);
	tamanho = ftell(arq);
	if (tamanho == 0)
		tamanho = 0;
	else
	{
		rewind(arq);
		while (!feof(arq))
		{
			fread(&cliente, sizeof(cadastro), 1, arq);
			id = cliente.ID;
		}
	}
	fseek(arq, 0, SEEK_END);

	while (escolha != 2)
	{
		system("cls");
		escolha = 0;

		setbuf(stdin, NULL);
		printf("Nome: ");
		gets_s(cliente.nome);
		setbuf(stdin, NULL);
		printf("Endereço: ");
		gets_s(cliente.endereco);
		setbuf(stdin, NULL);
		printf("Tipo de pedido: ");
		gets_s(cliente.tipo_pedido);
		setbuf(stdin, NULL);
		printf("Nome do pedido: ");
		gets_s(cliente.nome_pedido);
		setbuf(stdin, NULL);
		printf("Dia do pagamento: ");
		gets_s(cliente.dia_do_pagamento);
		setbuf(stdin, NULL);
		printf("Preço do pedido: ");
		scanf("%f", &cliente.preco_total);
		cliente.preco_restante = cliente.preco_total;
		cliente.status = 1;
		id++;
		cliente.ID = id;

		fwrite(&cliente, sizeof(cadastro), 1, arq);

		printf("Deseja cadastrar outro cliente? (1-SIM/2-NÃO): ");
		scanf("%d", &escolha);
	}
	return 0;
}
 
//Problema está nesta function----------------------------------------------------------------------------
int remove_cliente()
{
	int escolha = 0, sim_nao = 0;
	char nome_aux[30];

	setbuf(stdin, NULL);
	while (escolha != 2)
	{
		system("cls");
		escolha = 0;

		setbuf(stdin, NULL);
		printf("Nome do cliente: ");
		gets_s(nome_aux);

		rewind(arq);
		while (!feof(arq))
		{
			fread(&cliente, sizeof(cadastro), 1, arq);
			if ((strcmp(nome_aux, cliente.nome)) == 0)
			{
				system("cls");
				printf("Nome: %s", cliente.nome);
				printf("\nEndereço: %s", cliente.endereco);
				printf("\nTipo de pedido: %s", cliente.tipo_pedido);
				printf("\nNome de pedido: %s", cliente.nome_pedido);
				printf("\nDia do pagamento: %s", cliente.dia_do_pagamento);
				printf("\nPreço total do pedido: %.2f", cliente.preco_total);
				printf("\nPreço restante do pedido: %.2f", cliente.preco_restante);
				printf("\nID do cliente: %d", cliente.ID);
				if (cliente.status)
				{
					printf("\nCliente está ativo no sistema. Deseja mesmo desativar este cliente? (1-SIM/2-NÃO): ");
					scanf("%d", &sim_nao);
					if (sim_nao == 1)
					{
						int id = 0;
						id = cliente.ID;
						rewind(arq);
						cliente.ID = 0;
						if (id == 1)
							id++;
						fseek(arq, (id - 1) * sizeof(cadastro), SEEK_SET);
						fwrite(&cliente, sizeof(cadastro), 1, arq);
						break;
					}
				}
				else
				{
					printf("\nCliente está inativo no sistema. Deseja mesmo ativar este cliente? (1-SIM/2-NÃO): ");
					scanf("%d", &sim_nao);
					if (sim_nao == 1)
					{
						int id = 0;
						id = cliente.ID;
						rewind(arq);
						cliente.ID = 1;
						if (id == 1)
							id++;
						fseek(arq, (id - 1) * sizeof(cadastro), SEEK_SET);
						fwrite(&cliente, sizeof(cadastro), 1, arq);
						break;
					}
				}
				break;
			}
		}

		setbuf(stdin, NULL);
		printf("Deseja buscar outro cliente? (1-SIM/2-NÃO): ");
		scanf("%d", &escolha);
	}
	fseek(arq, 0, SEEK_END);
	return 0;
}
//-----------------------------------------------------------------------------------------------------------------

int mostra_cliente()
{
	int escolha = 0, tamanho = 0;

	fseek(arq, 0, SEEK_END);
	tamanho = ftell(arq);
	if (tamanho == 0)
	{
		printf("\nNenhum cadastro encontrado.\n\n");
		system("pause");
		fseek(arq, 0, SEEK_END);
		return 1;
	}
	else
	{
		setbuf(stdin, NULL);
		while (escolha != 5)
		{
			system("cls");
			escolha = 0;
			setbuf(stdin, NULL);

			printf("1->Mostrar todos os clientes\n");
			printf("2->Mostrar somente os clientes ativos\n");
			printf("3->Mostrar somente os clientes inativos\n");
			printf("4->Buscar um determinado cliente\n");
			printf("5->Sair\n:");
			scanf("%d", &escolha);
			if (escolha == 1)
			{
				system("cls");
				rewind(arq);
				while (!feof(arq))
				{
					fread(&cliente, sizeof(cadastro), 1, arq);
					printf("Nome: %s", cliente.nome);
					printf("\nEndereço: %s", cliente.endereco);
					printf("\nTipo de pedido: %s", cliente.tipo_pedido);
					printf("\nNome de pedido: %s", cliente.nome_pedido);
					printf("\nDia do pagamento: %s", cliente.dia_do_pagamento);
					printf("\nPreço total do pedido: %.2f", cliente.preco_total);
					printf("\nPreço restante do pedido: %.2f", cliente.preco_restante);
					printf("\nID do cliente: %d", cliente.ID);
					if (cliente.status)
						printf("\nStatus: Cliente ativo\n");
					else
						printf("\nStatus: Cliente inativo\n");
					printf("\n");
				}
				printf("\n"); system("pause"); printf("\n");
			}
			else if (escolha == 2)
			{
				system("cls");
				rewind(arq);
				while (!feof(arq))
				{
					fread(&cliente, sizeof(cadastro), 1, arq);
					if (cliente.status)
					{
						printf("Nome: %s", cliente.nome);
						printf("\nEndereço: %s", cliente.endereco);
						printf("\nTipo de pedido: %s", cliente.tipo_pedido);
						printf("\nNome de pedido: %s", cliente.nome_pedido);
						printf("\nDia do pagamento: %s", cliente.dia_do_pagamento);
						printf("\nPreço total do pedido: %.2f", cliente.preco_total);
						printf("\nPreço restante do pedido: %.2f", cliente.preco_restante);
						printf("\nID do cliente: %d", cliente.ID);
						printf("\nStatus: Cliente ativo\n");
					}
					printf("\n");
				}
				printf("\n"); system("pause"); printf("\n");
			}
			else if (escolha == 3)
			{
				system("cls");
				rewind(arq);
				while (!feof(arq))
				{
					fread(&cliente, sizeof(cadastro), 1, arq);
					if (cliente.status == 0)
					{
						printf("Nome: %s", cliente.nome);
						printf("\nEndereço: %s", cliente.endereco);
						printf("\nTipo de pedido: %s", cliente.tipo_pedido);
						printf("\nNome de pedido: %s", cliente.nome_pedido);
						printf("\nDia do pagamento: %s", cliente.dia_do_pagamento);
						printf("\nPreço total do pedido: %.2f", cliente.preco_total);
						printf("\nPreço restante do pedido: %.2f", cliente.preco_restante);
						printf("\nID do cliente: %d", cliente.ID);
						printf("\nStatus: Cliente inativo\n");
					}
					printf("\n");
				}
				printf("\n"); system("pause"); printf("\n");
			}
			else if (escolha == 4)
			{
				system("cls");
				char nome_aux[30];
				setbuf(stdin, NULL);
				printf("Nome: ");
				gets_s(nome_aux);
				rewind(arq);
				while (!feof(arq))
				{
					fread(&cliente, sizeof(cadastro), 1, arq);
					if ((strcmp(nome_aux, cliente.nome)) == 0)
					{
						printf("Nome: %s", cliente.nome);
						printf("\nEndereço: %s", cliente.endereco);
						printf("\nTipo de pedido: %s", cliente.tipo_pedido);
						printf("\nNome de pedido: %s", cliente.nome_pedido);
						printf("\nDia do pagamento: %s", cliente.dia_do_pagamento);
						printf("\nPreço total do pedido: %.2f", cliente.preco_total);
						printf("\nPreço restante do pedido: %.2f", cliente.preco_restante);
						printf("\nID do cliente: %d", cliente.ID);
						if (cliente.status)
							printf("\nStatus: Cliente ativo\n");
						else
							printf("\nStatus: Cliente inativo\n");
					}
				}
				printf("\n"); system("pause"); printf("\n");
			}
		}
	}

	fseek(arq, 0, SEEK_END);
	return 0;
}

int zera_arquivo()
{
	int tamanho = 0, escolha = 0, contador = 0;

	fseek(arq, 0, SEEK_END);
	tamanho = ftell(arq);

	if (tamanho == 0)
	{
		printf("\nNenhum cadastro encontrado.\n\n");
		system("pause");
		fseek(arq, 0, SEEK_END);
		return 1;
	}
	else
	{
		rewind(arq);
		while (!feof(arq))
		{
			fread(&cliente, sizeof(cadastro), 1, arq);
			contador++;
		}
		printf("Este arquivo possui %d cadastros. Realmente deseja excluir todos os cadastros (1-SIM/2-NÃO): ", contador - 1);
		scanf("%d", &escolha);
		if (escolha == 1)
		{
			fclose(arq);
			arq = fopen("cliente.dat", "w+b");
			fclose(arq);
			arq = fopen("cliente.dat", "a+b");
			return 0;
		}
	}
	return 1;
}

 

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×