Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida em Função Alterar


Minduca

Pergunta

Olá a todos,

fiz uma função de alterar um arquivo e quando executo-a apenas alguns campos alteram,

segue o código para análise:

switch(Opcao)

{

case 0: printf("\n\n\tFim de Alteracao."); break;

case 1: printf("\n\n\tDigite a Nova Marca:\n\t-> ");

gets(Dados.Marca); fflush(stdin); /* Lendo Nova Marca */

strcpy(Veic.Marca,Dados.Marca); break;

case 2: printf("\n\n\tDigite o Novo Modelo:\n\t-> ");

gets(Dados.Modelo); fflush(stdin); /* Lendo Novo Modelo */

strcpy(Veic.Modelo,Dados.Modelo); break;

case 3: printf("\n\n\tDigite o Novo Cambio:\n\t-> ");

gets(Dados.Cambio); fflush(stdin); /* Lendo Novo Cambio */

strcpy(Veic.Cambio,Dados.Cambio); break;

case 4: printf("\n\n\tDigite a Nova Cor:\n\t-> ");

gets(Dados.Cor); fflush(stdin); /* Lendo Nova Cor */

strcpy(Veic.Cor,Dados.Cor); break;

case 5: printf("\n\n\tDigite o Novo Combustivel:\n\t-> ");

gets(Dados.Combu); fflush(stdin); /* Lendo Novo Combustivel */

strcpy(Veic.Combu,Dados.Combu); break;

case 6: printf("\n\n\tDigite o Novo Ano de Fabricacao:\n\t-> ");

scanf ("%d", &Veic.Ano_fabri); fflush(stdin); /* Lendo Novo Ano de Fabricacao */

Veic.Ano_fabri = Dados.Ano_fabri; break;

case 7: printf("\n\n\tDigite o Novo Ano do Modelo:\n\t-> ");

scanf ("%d", &Veic.Ano_modelo); fflush(stdin); /* Lendo Novo Modelo */

Veic.Ano_modelo = Dados.Ano_modelo; break;

case 8: printf("\n\n\tDigite o Novo Numero de Portas:\n\t-> ");

scanf ("%d", &Veic.Num_porta); fflush(stdin); /* Lendo Novo Numero de Portas */

Veic.Num_porta = Dados.Num_porta; break;

case 9: printf("\n\n\tDigite a Nova Kilometragem:\n\t-> ");

scanf ("%d", &Veic.Km); fflush(stdin); /* Lendo Nova Kilometragem */

Veic.Km = Dados.Km; break;

case 10:printf("\n\n\tDigite o Novo numero da Placa:\n\t-> ");

scanf ("%d", &Veic.Num_placa); fflush(stdin); /* Lendo Nova Placa */

Veic.Num_placa = Dados.Num_placa; break;

case 11:printf("\n\n\tDigite o Numero do Novo Chassi:\n\t-> ");

scanf ("%d", &Veic.Num_chassi); fflush(stdin); /* Lendo Novo Chassi */

Veic.Num_chassi = Dados.Num_chassi; break;

case 12:printf("\n\n\tDigite o Novo preço de Custo:\n\t-> ");

scanf ("%f", &Veic.Preco_custo); fflush(stdin); /* Lendo Novo preço de Custo */

Veic.Preco_custo = Dados.Preco_custo; break;

case 13:printf("\n\n\tDigite o Novo preço de Venda:\n\t-> ");

scanf ("%f", &Veic.Preco_venda); fflush(stdin); /* Lendo Novo preço de Venda */

Veic.Preco_venda = Dados.Preco_venda; break;

}/*.....Fim switch......*/

Obs1: até o Case 5, que tem os comandos strcpy, os campos alteram legal, nos demais Case 6 ao Case 13, que estão em vermelho não!!??

Obs2: Quando faço o DEBUG e o cursor para no campo para entrar com o novo valor, este campo simplesmente não me dixa digitar o valor, ou seja, fica bloqueado e não consigo digitar nada????

O que ocorreu foi o seguinte:

Todos os campos estavam com o comando strcpy, mas o compilador acusava erro devido aos campos do case 6 ao case 13 serem long int e float, o comando strcpy não aceita campos assim!!então troquei o strcpy simplesmente atribuindo um campo sendo igual ao outro. O que poderia estar havendo, será que terei q deixar todos os campos definidos como char, para poder usar o strcpy??

Lembrando que a função funciona, pois os 5 primeiros cases, fazem a alteração normalmente!!

Se puderem ajudar, já agradeço.

Minduca

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
Você está lendo no Veic.xxxx, você tem que ler no Dados.xxxx, devido a estrutura atual do código.

Só mudar nos scanf.

Abraços.

Ok Durub, valeu!!!

Tenho outra dúvida, tenho uma função alterar e não estou conseguindo executar o rewind,

não da erro de compilação, mas quando debugo o programa o campo Veic.Cod_veic não posiciona no

1, veja o código abaixo e, se puder, me de uma luz do que estou errando:

void Alterar(void)

{

struct Veiculo *Dados;

char a;

int i,Achar=0,Opcao=1;

int Codveic;

/*.........................................................................................................................*/

p = fopen(str,"rb"); /* Abre Arquivo para Leitura */

do

{

system("cls");

printf("\n\n\tDigite o Codigo do Veiculo:\n\t->");

scanf("%d",&Codveic);

rewind(p);

for(i=0 ;i<cont ;i++)

{

fread(&Veic,sizeof(struct Veiculo),1,p); /* Lê a struct no Arquivo */

if (Codveic == Veic.Cod_veic)

{

Achar=1; /* O Código Foi Encontrado */

Opcao=0;

break;

}

}

Obs: o campo Veic.Cod_veic, aparece o cod de número 2, uma vez que o arquivo tem 2 registros

ou seja, o rewind não esta posicionando o arquivo no início, senão este campo

estaria com o código 1. Como estou começando agora em C, talvez esteja fazendo algo errado.

Vi na internet algo sobre definir o FILE *p, utilizei este procedimento porém o campo continuou no último registro!!!!

Se der, me de a dica do que pode ser??

Abraço

Minduca

Link para o comentário
Compartilhar em outros sites

  • 0
Ok Durub, valeu!!!

Tenho outra dúvida, tenho uma função alterar e não estou conseguindo executar o rewind...

Abraço

Minduca

Olá !

Já solucionei o problema do rewind questionado acima,

utilizei o fseek(p, 0, SEEK_SET);

funcionou legal.

Tenho um outro problema ocorrendo, utilizo um break quando

vou Cadastrar um novo código no arquivo que é pra não deixar entrar

com códigos duplicados, só que quando encontro o código e informo

ao usuário que o mesmo já existe, o break não interrompe a

sequencia, ou seja, a mensagem é exibida ao usuário mas o

programa continua e pede o proximo campo?? porque o break

não funciona??

segue a parte do código da inclusão onde os comandos break

não funcionam:

printf("\n\n\t-- == Digite 0 pra Sair ==--");

printf("\n\tDigite o Codigo do Veiculo: ");

scanf ("%d", &Veic.Cod_veic); fflush(stdin);

Codveic = Veic.Cod_veic;

Verifica_cod(Codveic); /* chamada da função que verifica o codigo */

fseek(p, cont, SEEK_END); /* caso não encontre o códio volto a posição do arquivo para o ultimo reg. */

if (Veic.Cod_veic == 0)

break; /* ESTE BREAK também não esta funcionando !!!! ????? */

printf("\n\tDigite a Marca: "); /* EXECUTA mesmo com o código encontrado ou se digitado 0 para finalizar */

gets(NovaMarca); fflush(stdin);

segue a função Verifica_cod :

void Verifica_cod(int long Codveic)

{

int i;

fseek(p, 0, SEEK_SET); /* posicionando o arquivo no início */

for(i=0 ;i<cont ;i++)

{

fread(&Veic,sizeof(struct Veiculo),1,p); /* Lê a struct no Arquivo */

if (Codveic == Veic.Cod_veic)

{

printf("\n\n\tO Codigo de Veiculo %d já existe ",Veic.Cod_veic); /* O Codigo do Veiculo Foi Encontrado */

printf("\n\tDigite ENTER para entrar com outro registro ");

break;

}

}

}

Agradeceria a ajuda neste caso !!

Valeu

Minduca

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...