Ir ao conteúdo

Posts recomendados

Postado

Estou fazendo um programa ( trabalho de faculdade ) , para cadastro de jogos ( era cadastro de qualquer coisa, escolhi jogos ) , é preciso que o programa tenha a opção do usuario alterar um registro existente, os dados são gravados em arquivo... estou postando aqui somente a função que criei para alterar um registro... quando escolho essa opção, no programa, tudo é executado normalmente, mas os dados não são alterados... preciso de uma ajuda aí ^^ desda ja obrigado

void alterar(FILE *pont, int codigo)

{

struct jogo cad;

int sucesso=0;

do {

if (fread(&cad,sizeof(struct jogo),1,pont) == 0)

break;

if (cad.codigo == codigo)

{ system("cls");

printf("<<<<<Registro Antigo>>>>>\n\n");

printf("Codigo............: %d\n",cad.codigo);

printf("Jogo..............: %s\n",cad.nome_jogo);

printf("Plataforma........: %s\n",cad.plataforma);

printf("Desenvolvedor'a'..: %s\n",cad.desenvolvedor_a);

printf("Ano...............: %d\n\n",cad.ano);

printf("<<<<<Digite o Registro novo>>>>\n\n");

printf("Código..........: ");

scanf("%d", &cad.codigo);

fflush(stdin);

printf("Nome do Jogo....: ");

gets(cad.nome_jogo);

printf("Plataforma......: ");

gets(cad.plataforma);

printf("Desenvolvedor'a': ");

gets(cad.desenvolvedor_a);

fflush(stdin);

printf("Ano.............: ");

scanf("%d", &cad.ano);

fflush(stdin);

cad.deletado=0;

fwrite(&cad,sizeof(struct jogo),1,pont);

sucesso=1;

break;

}

} while(1);

if (!sucesso)

printf("Jogo não encontrado no arquivo\n");

system("pause");

}

Postado

Vamos lá:

1) Primeiro seu arquivo deve estar aberto para leitura e gravação

FILE * meuarq;

meuarq = fopen("jogos.dat", "r+b");

2) Chamar a função informando o código do registro a ser alterado:

alterar(meuarq, 10); // por exemplo, alterar o registro de codigo 10

3) Modifiquei (em vermelho) o seu código para:


void alterar(FILE *pont, int codigo)
{
struct jogo cad;
int sucesso=0;
[COLOR="Red"]

int posicao = 0; // inicio do arquivo

// usar fseek para ir ao inicio do arquivo pois
// voce pode estar adiante do registro que quer alterar

fseek(pont, posicao, SEEK_SET);

[/COLOR]
do {
if (fread(&cad,sizeof(struct jogo),1,pont) == 0)
break;
if (cad.codigo == codigo)
{
system("cls");
printf("<<<<<Registro Antigo>>>>>\n\n");
printf("Codigo............: %d\n",cad.codigo);
printf("Jogo..............: %s\n",cad.nome_jogo);
printf("Plataforma........: %s\n",cad.plataforma);
printf("Desenvolvedor'a'..: %s\n",cad.desenvolvedor_a);
printf("Ano...............: %d\n\n",cad.ano);
printf("<<<<<Digite o Registro novo>>>>\n\n");
printf("Código..........: ");
scanf("%d", &cad.codigo);
fflush(stdin);
printf("Nome do Jogo....: ");
gets(cad.nome_jogo);
printf("Plataforma......: ");
gets(cad.plataforma);
printf("Desenvolvedor'a': ");
gets(cad.desenvolvedor_a);
fflush(stdin);
printf("Ano.............: ");
scanf("%d", &cad.ano);
fflush(stdin);
cad.deletado=0;
[COLOR="red"]
// quando você le o arquivo o ponteiro se desloca.
// é necessario voltar para a posicao anterior a
// da leitura que é onde o registro começa

fseek(pont, posicao, SEEK_SET);

// agora sim, podemos gravar
// e é melhor o sucesso estar condicionado a
// correta gravacao do registro (abaixo)
[/COLOR]
sucesso= fwrite(&cad,sizeof(struct jogo),1,pont) == sizeof(struct jogo);
break;
}
[COLOR="Red"]
// ajustar posicao em relação ao inicio do arquivo
posicao = posicao + sizeof(struct jogo);
[/COLOR]
} while(1);
if (!sucesso)
printf("Jogo não encontrado no arquivo\n");
system("pause");
}

Uma observação:

1) Não acho legal permitir trocar de código.

Acho que é isto. Vamos ver se funciona... :)

Postado

Cara, muito obrigado, deu certo sim, eu tinha visto em um forum que era preciso usar o fseek, mas não sabia a maneira correta de usa-lo, quanto a abertura do arquivo, ela esta sendo feita fora da função alterar, e passo para a função o ponteiro relacionado ao arquivo, eu estava usando o modo de abertura errado para o momento tambem.

Bom cara valeu mesmo, tudo de bom pra você ^^

Postado

Depois do programa pronto, estava testando e percebi uma coisa, nada impede do usuario digitar um codigo ja existente no registro na hora de inserir um registro, se ocorrer isso, causara problemas na hora de pesquisar por codigo, pois só um ods registros aparecera sem escolha de qual dos dois, e na hora de deletar um registro, ja que deleta pelo codigo, ira ocorrer o mesmo problema da pesquisa, tentei de varias maneiras um jeito de prevenir que fossem registrados dois codigos iguais, mas não consegui... como posso fazer isso ?? desde ja obrigado :) de novo :)

Postado

Antes de inserir o registro, teste se o codigo já existe.

Vai ter que fazer uma função que varre o arquivo inteiro, e retorna a existência daquele código.

Existindo, você pode dar a opção para alterar o registro ou informar outro código para inclusão.

É um procedimento normal em aplicações de cadastro...

  • 8 anos depois...
Postado
Em 25/11/2007 às 18:54, DDavansoS disse:

Estou fazendo um programa ( trabalho de faculdade ) , para cadastro de jogos ( era cadastro de qualquer coisa, escolhi jogos ) , é preciso que o programa tenha a opção do usuario alterar um registro existente, os dados são gravados em arquivo... estou postando aqui somente a função que criei para alterar um registro... quando escolho essa opção, no programa, tudo é executado normalmente, mas os dados não são alterados... preciso de uma ajuda aí ^^ desda ja obrigado

void alterar(FILE *pont, int codigo)

{

struct jogo cad;

int sucesso=0;

do {

if (fread(&cad,sizeof(struct jogo),1,pont) == 0)

break;

if (cad.codigo == codigo)

{ system("cls");

printf("<<<<<Registro Antigo>>>>>\n\n");

printf("Codigo............: %d\n",cad.codigo);

printf("Jogo..............: %s\n",cad.nome_jogo);

printf("Plataforma........: %s\n",cad.plataforma);

printf("Desenvolvedor'a'..: %s\n",cad.desenvolvedor_a);

printf("Ano...............: %d\n\n",cad.ano);

printf("<<<<<Digite o Registro novo>>>>\n\n");

printf("Código..........: ");

scanf("%d", &cad.codigo);

fflush(stdin);

printf("Nome do Jogo....: ");

gets(cad.nome_jogo);

printf("Plataforma......: ");

gets(cad.plataforma);

printf("Desenvolvedor'a': ");

gets(cad.desenvolvedor_a);

fflush(stdin);

printf("Ano.............: ");

scanf("%d", &cad.ano);

fflush(stdin);

cad.deletado=0;

fwrite(&cad,sizeof(struct jogo),1,pont);

sucesso=1;

break;

}

} while(1);

if (!sucesso)

printf("Jogo não encontrado no arquivo\n");

system("pause");

}

 

 

 

 

Oi colgega, eu tenho um trabalho da faculdade parecido com este.Teria como tu postar ele completo  para eu olhar?Obrigada

Visitante
Este tópico está impedido de receber novas respostas.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!