Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×