Bom, indo direto ao assunto; estou com um problema bem chato. O programa é um banco de dados, que simula um sistema de Banco ($), onde o "gerente" escolhe entre inserir uma conta física ou jurídica... Enfim, o programa deve conter as funções de Inserir/Listar/Alterar/Excluir (se trata de um trabalho da faculdade). O problema está, acredito eu, na função de alterar. Peço para que vocês insiram 2 pessoas físicas, listem as mesmas, e depois tentem alterar uma delas. É possível notar um erro no ID do cadastrado. Por exemplo, se altero o cliente 1, ele volta com ID 2, porém o ID 2 já pertence ao cliente 2... Peço a ajuda de vocês para solucionar este problema. Desde já, grato
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define AUTOCLIENTE "autoCliente.dat"
#define CLIENTE "cliente.dat"
#define AUTOEMPRESA "autoEmpresa.dat"
#define EMPRESA "empresa.dat"
//BANCO $$\\*
struct autoNum{
int numero;
};
struct empresa
{
int id; //ID da empresa (PESSOA JURIDICA)
char nome[30]; //Nome da empresa
int cnpj; //CNPJ da empresa
};
struct cliente
{
int id; //ID do cliente (PESSOA FISICA)
char nome[30]; //Nome do cliente
int cpf; //CPF do cliente
};
int main ()
{
//funções
void listarC (struct cliente par1,FILE *arquivoCliente);
void listarE (struct empresa par1,FILE *arquivoEmpresa);
int alterarC (struct cliente par1,FILE *arquivoCliente, fpos_t byte);
int alterarE (struct empresa par1);
int eliminarC ();
int eliminarE ();
int consultarC(struct cliente par1,FILE *arquivoCliente,char pesquisado[30] );
int consultarE;
//variáveis
int opcao,lixo,pessoa,listar,alterar;
char clientePesquisado[30];
fpos_t byte;
int autonumC=0;
int autonumE=0;
//estruturas
struct cliente x;
struct empresa y;
struct autoNum n;
//arquivos
FILE *arquivoAutoC,*arquivoCliente, *arquivoAutoE,*arquivoEmpresa;
do{ //APRESENTA OPÇÕES PARA O USUARIO
system("cls"
printf("-------------------------------------------------------------------------------\n"
printf(" PROGRAMA BANCARIO \n"
printf("-------------------------------------------------------------------------------"
printf("\n\n[1] Incluir"
printf("\n[2] Listar"
printf("\n[3] Alterar"
printf("\n[4] Eliminar"
printf("\n[0] Sair"
printf("\n\nDigite sua opcao: "
scanf("%d",&opcao);
switch(opcao){ //ANALISA QUAL OPÇÃO FOI ESCOLHIDA ACIMA
case 1: system("cls"
printf("-------------------------------------------------------------------------------\n"
printf(" PROGRAMA BANCARIO \n"
printf("-------------------------------------------------------------------------------"
printf("\n\n[1] Incluir pessoa fisica"
printf("\n[2] Incluir pessoa juridica"
printf("\n[0] Voltar"
printf("\n\nDigite sua opcao: "
scanf("%d",&pessoa);
switch(pessoa){ //ANALISA QUAL OPÇÃO FOI ESCOLHIDA ACIMA
case 1: arquivoAutoC = fopen(AUTOCLIENTE,"r+b"
if (arquivoAutoC==NULL){
arquivoAutoC = fopen(AUTOCLIENTE,"wb"
n.numero=1;
fwrite(&n,sizeof(int),1,arquivoAutoC);}
else{
fread(&n,sizeof(int),1,arquivoAutoC);
n.numero++;
fseek(arquivoAutoC,0,SEEK_SET);
fwrite(&n,sizeof(int),1,arquivoAutoC);}
fclose(arquivoAutoC);
x.id = n.numero;
printf("\nID: %d",x.id);
printf("\nNome do Cliente: "
fflush(stdin); //limpa o lixo do teclado
gets(x.nome); //salva o nome com espaços
printf("CPF: "
scanf("%d",&x.cpf);
arquivoCliente = fopen(CLIENTE,"ab+"
if (arquivoCliente==NULL)
arquivoCliente = fopen(CLIENTE,"wb"
fwrite(&x,sizeof(x),1,arquivoCliente);
fclose(arquivoCliente);
fflush(stdin);
//getchar();
break;
case 2: arquivoAutoE = fopen(AUTOEMPRESA,"r+b"
if (arquivoAutoE==NULL){
arquivoAutoE = fopen(AUTOEMPRESA,"wb"
n.numero=1;
fwrite(&n,sizeof(int),1,arquivoAutoE);}
else{
fread(&n,sizeof(int),1,arquivoAutoE);
n.numero++;
fseek(arquivoAutoE,0,SEEK_SET);
fwrite(&n,sizeof(int),1,arquivoAutoE);}
fclose(arquivoAutoE);
y.id=n.numero;
printf("\nID: %d",y.id);
printf("\nNome da Empresa: "
fflush(stdin); //limpa o lixo do teclado
gets(y.nome); //salva o nome com espaços
printf("CNPJ: "
scanf("%d",&y.cnpj);
arquivoEmpresa = fopen(EMPRESA,"ab+"
if (arquivoEmpresa==NULL)
arquivoEmpresa = fopen(EMPRESA,"wb"
fwrite(&y,sizeof(y),1,arquivoEmpresa);
fclose(arquivoEmpresa);
fflush(stdin);
//getchar();
break;
}
break;
case 2: system("cls"
printf("-------------------------------------------------------------------------------\n"
printf(" PROGRAMA BANCARIO \n"
printf("-------------------------------------------------------------------------------"
printf("\n\n[1] Listar pessoa fisica"
printf("\n[2] Listar pessoa juridica"
printf("\n[0] Voltar"
printf("\n\nDigite sua opcao: "
scanf("%d",&listar);
switch(listar){ //ANALISA QUAL OPÇÃO FOI ESCOLHIDA ACIMA
case 1: arquivoCliente=fopen(CLIENTE,"rb"
listarC(x,arquivoCliente);
fclose(arquivoCliente);
fflush(stdin);
getchar();
break;
case 2: arquivoEmpresa=fopen(EMPRESA,"rb"
listarE(y,arquivoEmpresa);
fclose(arquivoEmpresa);
fflush(stdin);
getchar();
break;
}
break;
case 3: system("cls"
printf("-------------------------------------------------------------------------------\n"
printf(" PROGRAMA BANCARIO \n"
printf("-------------------------------------------------------------------------------"
printf("\n\n[1] Alterar pessoa fisica"
printf("\n[2] Alterar pessoa juridica"
printf("\n[0] Voltar"
printf("\n\nDigite sua opcao: "
scanf("%d",&alterar);
switch(alterar){ //ANALISA QUAL OPÇÃO FOI ESCOLHIDA ACIMA
case 1: printf("\nDigite o nome do cliente: "
fflush(stdin);
gets(clientePesquisado);
arquivoCliente=fopen(CLIENTE,"rb+"
byte = consultarC(x,arquivoCliente,clientePesquisado);
fseek(arquivoCliente,0,SEEK_SET);
if(byte!=-1){
printf("\nID: %d\n",x.id);
printf("Nome do Cliente: "
fflush(stdin);
gets(x.nome);
printf("CPF: "
scanf("%d",&x.cpf);
if(alterarC(x,arquivoCliente,byte))
printf("\nRegistro alterado com sucesso.\n"}
else
printf("\nRegistro nao encontrado\n"
fclose(arquivoCliente);
fflush(stdin);
getchar();
break;
/*lixo=alterarC(x);
printf("%d",lixo);
fflush(stdin);
getchar();
break; */
case 2: lixo=alterarE(y);
printf("%d",lixo);
fflush(stdin);
getchar();
break;
}
break;
/*
case 4: lixo=lixo();
printf("%d",lixo);
fflush(stdin);
getchar();
break;*/
}
}
while (opcao!=0);
return 0;
}
void listarC (struct cliente par1,FILE *arquivoCliente) //lISTA OS CLIENTES
{
while (fread(&par1,sizeof(par1),1,arquivoCliente))
printf("\n\n%d %s %d",par1.id,par1.nome,par1.cpf);
}
void listarE (struct empresa par1,FILE *arquivoEmpresa) //lISTA AS EMPRESAS
{
while (fread(&par1,sizeof(par1),1,arquivoEmpresa))
printf("\n\n%d %s %d",par1.id,par1.nome,par1.cnpj);
}
int consultarC(struct cliente par1,FILE *arquivoCliente,char pesquisado[30]){
fpos_t byte;
int tam=sizeof(par1);
while (fread(&par1,sizeof(par1),1,arquivoCliente)){
if (strcmp(pesquisado,par1.nome)==0){
byte=ftell(arquivoCliente)-tam;
return(byte);}}
return -1;
}
int alterarC(struct cliente par1,FILE *arquivoCliente, fpos_t byte) //ALTERA OS CLIENTES
{
fsetpos(arquivoCliente,&byte);
fwrite(&par1,sizeof(par1),1,arquivoCliente);
return 0;
}
int alterarE(struct empresa par1) //ALTERA AS EMPRESAS
{
return 3;
}
void imprimir()
{
printf("SEM RETORNO"
}