Santana Oliveira Posted September 21, 2013 at 08:09 PM Report #525450 Posted September 21, 2013 at 08:09 PM (edited) 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 September 25, 2013 at 02:46 PM by Santana Oliveira Adicionadas tags GeShi
nunopicado Posted September 21, 2013 at 08:18 PM Report #525451 Posted September 21, 2013 at 08:18 PM 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. 1 Report "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.
pwseo Posted September 22, 2013 at 04:03 PM Report #525488 Posted September 22, 2013 at 04:03 PM 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. 1 Report
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now