Jump to content


Photo

Dúvida Em Alterar/Excluir Registro De Arquivo C


  • Faça o login para participar
10 replies to this topic

#1 francisconeto15

francisconeto15

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:Guaxupé MG

Posted 28/02/2012, 09:59

Boa dia galera, estou com uma dúvida em como faço uma função para alterar e outra para excluir arquivo, comecei a programar começo do mês por conta própria, mas poder entrar ano que vem com tudo na facu, mas está meio complicado,rsrs.
Vocês poderiam por favor me ajudar?
Agradeço desde já.

O código é esse:

http://pastebin.com/paZPcfYx

é simples, mas foi tudo que consegui fazer.

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 28/02/2012, 13:13

Rapaz, que coisa bem escrita. Incrível pra quem acabou de começar. :blink:

Sobre o seu problema, fazer a edição é simples, porque é só passar por cima, já que a estrutura tem um tamanho fixo. Você pesquisa a banda que a pessoa quer alterar e carrega os dados. Quando for na hora de salvar, você posiciona o cursor do arquivo na posição certinha em que está o registro e escreve por cima. Já excluir é mais complicado, porque pra não ficar um buraco no arquivo, você teria que puxar todo mundo que vem depois pra cima. A princípio, o melhor é você acrescentar mais uma variável na estrutura chamada "excluido" (0 ou 1). Daí na pesquisa você ignora todo mundo com excluido=1. Depois acrescenta uma opção como "otimizar arquivo" ou coisa assim. Nela você recria o arquivo mantendo só os registros com excluido=0.

Completando: na pesquisa, você precisa percorrer o arquivo inteiro. Ali está lendo só o primeiro registro.

Edição feita por: LeoB, 28/02/2012, 13:14.


#3 francisconeto15

francisconeto15

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:Guaxupé MG

Posted 28/02/2012, 17:41

hehe vlw, to aproveitando o maximo que posso do meu tempo livre, entre escola e escola..kkkk
entao eu modifiquei a função de pesquisa, só que ela fica agora repetindo a mensagem nao encontrado 2x ou o nome da banda 2x..
E tentei fazer a função alterar, mas nao conseguir, será que pode me explicar mais simples ou me dar um exemplo?

Aqui o novo codigo:
http://pastebin.com/naYR97Sq

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 28/02/2012, 23:21

Você precisa ter em mente que quando um arquivo é aberto, ele tem um cursor, como esse que fica piscando enquanto a gente digita as coisas. O cursor aponta em que ponto o arquivo vai ser lido ou escrito. E toda vez que dados são lidos ou escritos esse cursor anda. Quando você vai fazer uma pesquisa, primeiro precisa mover o cursor pro começo do arquivo, pra conseguir ler todos os registros. Precisa também de uma variável pra saber se achou ou não o registro. Essa informação você só tem depois de percorrer o arquivo todo.

bool achou = false;
...
rewind(arquivo);
do
{
    fread(&Banda,sizeof(struct Registro_Banda),1,arquivo);
    if(strcmp(Nomepesquisa,Banda.nome_banda) == 0){
       printf("Nome: %s\n",Banda.nome_banda);
       printf("Data: %d\n",Banda.data);
       printf("Codigo: %d\n",Banda.cod);
       achou = true;
    }
}while(!feof(arquivo));
if(!achou){
     printf("Nome nao encontrado\n");
}
printf("\n----------------------------------------------------------\n\n");
A cada leitura/escrita, o cursor avança na quantidade de bytes correspondentes à estrutura lida/escrita. Sua estrutura tem 62 bytes. Então esse é o tamanho dos blocos que são lidos/escritos. Quando você quiser alterar um deles, é só posicionar o cursor com fseek() no começo do bloco correspondente e escrever o registro alterado por cima do existente com fwrite() mesmo.

#5 francisconeto15

francisconeto15

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:Guaxupé MG

Posted 01/03/2012, 14:19

Você precisa ter em mente que quando um arquivo é aberto, ele tem um cursor, como esse que fica piscando enquanto a gente digita as coisas. O cursor aponta em que ponto o arquivo vai ser lido ou escrito. E toda vez que dados são lidos ou escritos esse cursor anda. Quando você vai fazer uma pesquisa, primeiro precisa mover o cursor pro começo do arquivo, pra conseguir ler todos os registros. Precisa também de uma variável pra saber se achou ou não o registro. Essa informação você só tem depois de percorrer o arquivo todo.

bool achou = false;
...
rewind(arquivo);
do
{
    fread(&Banda,sizeof(struct Registro_Banda),1,arquivo);
    if(strcmp(Nomepesquisa,Banda.nome_banda) == 0){
       printf("Nome: %s\n",Banda.nome_banda);
       printf("Data: %d\n",Banda.data);
       printf("Codigo: %d\n",Banda.cod);
       achou = true;
    }
}while(!feof(arquivo));
if(!achou){
     printf("Nome nao encontrado\n");
}
printf("\n----------------------------------------------------------\n\n");
A cada leitura/escrita, o cursor avança na quantidade de bytes correspondentes à estrutura lida/escrita. Sua estrutura tem 62 bytes. Então esse é o tamanho dos blocos que são lidos/escritos. Quando você quiser alterar um deles, é só posicionar o cursor com fseek() no começo do bloco correspondente e escrever o registro alterado por cima do existente com fwrite() mesmo.


Boa tarde amigo, eu fiz o alterar, mas não está funcionando, ele fecha o programa sozinho, o que poderia ser?

O codigo é esse: http://pastebin.com/jzRZhpAe

E a respeito da função não conseguir nem começar ela, não teria como você me arrumar ela e explicar ela?

Amigo fiz a função alterar, mas ela fica fechando sozinha, o que poderia ser?

O programa é esse: http://pastebin.com/1MetRzPs

Já a função excluir nao conseguir fazer, você não poderia fazer ela e explicar-la por favor?

Vlw

#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 01/03/2012, 15:01

Oi. Está no caminho certo. Que programa você está usando pra desenvolver?

Só uma observação: os registros deletados devem ser ignorados, então você precisa cuidar disso tanto na pesquisa quanto na alteração.

if(Banda.deletado == 0 && strcmp(Nomepesquisa,Banda.nome_banda) == 0)

Edição feita por: LeoB, 01/03/2012, 15:02.


#7 francisconeto15

francisconeto15

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:Guaxupé MG

Posted 01/03/2012, 15:10

Estou usando o Code Blocks, mas essa parte de deletar, e ignorar arquivo ta me confundindo toda a cabeça.
Tem outra maneira de entrar em contato com voce amigo além do forum?

#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 01/03/2012, 15:20

Tem o MSN. Entra em contato por MP.

#9 francisconeto15

francisconeto15

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:Guaxupé MG

Posted 01/03/2012, 15:34

Enviei o Mp, manda pra mim por mp seu msn entao, pode ser?
Cara até agora não conseguir fazer a função alterar funcionar direito.=/

#10 Entruder

Entruder

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Não informado

Posted 27/12/2016, 18:48

Pessoal o caso foi solucionado? EStou com um trabalho semelhante, e preciso alterar dados de um struct em um arquivo, e preciso usar essa mesma função seek, mas ta xxxxxx de conseguir...



#11 Manaus Web

Manaus Web

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Masculino

Posted 10/05/2017, 15:04

No lugar do "r", acrescenta o + ai fica "r+" que é leitura e escrita no alterar testei aqui não fecha não quando termino de alterar.






2 user(s) are reading this topic

0 membro(s), 2 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq