Ir ao conteúdo
  • Cadastre-se

ira_titanica

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

Reputação

6
  1. 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; }
  2. Funcionou agora. Muito obrigado.
  3. Olá, estou com um pequeno problema trabalhando com arquivos. O sistema de cadastro é continuo, ou seja, o número sempre cresce. O problema é o seguinte, o usuário cadastra três pessoas e fecha o programa, quando ele retornar e for cadastrar mais, o número deverá ser quatro, estou tratando isto como o ID. Lembrando que tenho como objetivo percorrer estrutura por estrutura no arquivo. Obrigado desde já. #include <stdio.h> #include <stdlib.h> typedef struct estrutura { char nome[30], endereco[30], fone[10]; int ID; }cadastro; FILE *arq; int insere_cliente(cadastro *cliente); int main() { arq = fopen("pessoas.dat", "a+b"); cadastro cliente; int recebe; recebe = insere_cliente(&cliente); fclose(arq); return 0; } int insere_cliente(cadastro *cliente) { int conta = 0, decisão = 0, tamanho = 0; //--------------------------------PROBLEMA ESTA AQUI fseek(arq, 0, SEEK_END); tamanho = ftell(arq) - 1; if (tamanho <= 0) conta = 0; else { rewind(arq); while (!feof(arq)) { fseek(arq, 1 * sizeof(cliente), SEEK_SET); conta++; } } //------------------------------------------------- while (1) { conta++; system("cls"); setbuf(stdin, NULL); printf("Nome: "); gets_s(cliente->nome); setbuf(stdin, NULL); printf("Endereço: "); gets_s(cliente->endereco); setbuf(stdin, NULL); printf("Telefone: "); gets_s(cliente->fone); cliente->ID = conta; fwrite(&cliente, sizeof(cliente), 1, arq); setbuf(stdin, NULL); printf("Deseja continuar? (1-SIM/2-NÃO): "); scanf("%d", &decisão); if (decisão == 1) break; } return 0; }

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