Jump to content
Santana Oliveira

[Resolvido] Como Remover e Alterar dados de ficheiro.dat (urgente)

Recommended Posts

Santana Oliveira

Eu estou a fazer um programa para um clube de video mas estou com problemas.

Alguém me pode explicar como posso alterar e remover os dados do ficheiro onde guardo os dados.

Código do programa feiro até agora:

Edited by Santana Oliveira
Adicionadas tags GeShi

Share this post


Link to post
Share on other sites
nunopicado

Primeira coisa: O Assign não é para estar dentro do procedimento Inserir.

O Assign é feito uma vez só no programa, não vais associar o ficheiro de cada vez que inseres um registo, até porque isso implicava repetires o Assign também dentro do Eliminar e do Modificar.

Para Modificar é simples:

Usas o Seek para procurar a posição do registo a modificar, e depois voltas a gravar. Ele irá ser substituido.

Terás de o usar duas vezes para manteres a posição se precisas de o ler antes de modificar:

Por exemplo, para alterar o 5º registo:

seek(f,4); // os registos no Seek começam em 0
Read(f,reg);
reg.Nome:='novo nome';
Seek(f,4);
Write(f,4);

Para eliminar, tens de consolidar o ficheiro e depois eliminar o ultimo registo.

Por exemplo, se quiseres eliminar o registo 5, passas o 6 para cima do 5, o 7 para cima do 6 e por aí fora até ao último.

Depois, posicionas-te no ultimo registo e gravas um EOF.

Em alternativa é criares um ficheiro temporario em que gravas todos os registos menos o que queres apagar.

Depois eliminas o ficheiro original, e renomeias o temporario para o nome do original.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

Antes de começarmos a pensar em alterar/eliminar registos, temos que ter uma estrutura adequada que nos permita identificar esses mesmos registos de forma unívoca -- precisamos de uma chave primária (um dos conceitos mais básicos das bases de dados). Opto por incluir um id em cada registo, cujo valor será auto-incrementado (ie. nunca haverá dois registos com o mesmo id).

type Filme = record
 id: integer;  (* cá está a nossa chave primária! *)
 nome, desc: string[50];
 ano: integer;
 deleted: boolean;
end;

O teu código (no procedimento inserir) cria um ficheiro de novo sempre que queres inserir filmes, o que significa que caso o utilizador insira 3 filmes e desligue o computador, quando voltar ao programa para inserir mais 2, os anteriores deixaram de existir. É este o comportamento desejado? Se estamos a guardar dados em ficheiros, seria de esperar alguma persistência dos mesmos, caso contrário não serve de nada guardar em ficheiros.

Relativamente à alteração/eliminação de registos, existem várias abordagens. O nunopicado já mencionou uma, por isso vou falar de uma um pouco mais complexa.

Já que cada registo contém um campo deleted, podemos utilizar isso a nosso favor: se lermos os registos todos no início do programa para um array, podemos simplesmente fazer todas as alterações em memória (inclusive apagar registos, que se resume a definir deleted := true) e, à saída do programa, escrever todos os registos em memória para o ficheiro (saltando os que estejam deleted).

Nesta questão é que entra o campo id -- é ele que permite ao utilizador especificar qual o filme a alterar/eliminar sem ter que escrever o seu nome completo (e não basta usar o número de ordem do filme, pois basta eliminar o 3º filme (numa lista com 5), e rapidamente o 4 e 5 passam a ser 3 e 4, para confusão do utilizador). Moral da história: identificadores numéricos são como referências de um produto -- não podem mudar.

Posto isto, há diversas outras coisas que poderiam ser melhoradas, entre elas a indentação, alguma repetição de código (que é indesejável), e até mesmo a falta de parametrização do código. Mas isso são questões adicionais que não se enquadram nas perguntas que colocaste inicialmente.

  • Vote 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.