Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
cysco

Erro na leitura de ficheiro

Recommended Posts

cysco

Boas.

Estou aqui com um problema num programa..

O programa é uma base de dados pessoal, mas ainda só fiz a parte da agenda.

O utilizador deve inserir um evento e a sua data, e de seguida guarda a informação num ficheiro.

Quando vou para ler os eventos ou para modificar o programa crasha!!

Não dá erros na compilação nem nada.

Fica o codigo para testarem e verem qual o problema, é que não entendo mesmo  🤔

(ainda só ta a funcionar o menu agenda)

type registoperfil=record
nome:string[25];
idade:integer;
sexo:string;
localidade:string;
morada:string;
estadocivil:string;
ntelefone:string;
mail:string;
coisa:array [1..20] of string;
passwordcoisa:array [1..20] of string;
end;
type registocontactos=record
ncontacto1:string;
contacto1:string;
ncontacto2:string;
contacto2:string;
ncontacto3:string;
contacto3:string;
ncontacto4:string;
contacto4:string;
ncontacto5:string;
contacto5:string;
end;
type registoagenda=record
acontecimento1:string;
dataacont1:string;
acontecimento2:string;
dataacont2:string;
acontecimento3:string;
dataacont3:string;
acontecimento4:string;
dataacont4:string;
acontecimento5:string;
dataacont5:string;
end;
type registopasswords=record
coisa1:string;
passcoisa1:string;
coisa2:string;
passcoisa2:string;
coisa3:string;
passcoisa3:string;
coisa4:string;
passcoisa4:string;
coisa5:string;
passcoisa5:string;
end;

var x,n,y,soma,res:integer;
fichperfil: File of registoperfil;
fichcontactos: File of registocontactos;
fichagenda: File of registoagenda;
fichpasswords: File of registopasswords;
perfil:registoperfil;
contactos:registocontactos;
agenda:registoagenda;
passwords:registopasswords;
resmenu,ressubmenu:string;
function existeficheiroagenda: boolean;
begin
assign (fichagenda, 'agenda.dat');
{$I-};
Reset (fichagenda);
Close (fichagenda);
{$I+};
existeficheiroagenda:=(IoResult=0);
end;
procedure menu;
begin
Writeln ('     O meu cofre');
Writeln;
Writeln ('Agenda           -> 1'); {Eventos}
Writeln ('Contactos        -> 2'); {Lista telefonica}
Writeln ('Dados Pessoais   -> 3'); {Passwords cartões/serviços}
Writeln ('Perfil           -> 4'); {Nome, morada, idade, etc}
Writeln ('Sair             -> 0');
Readln (resmenu);
end;
procedure xagenda;
begin
Writeln ('Inserir Evento       -> 1');
Writeln ('Modificar Evento     -> 2');
Writeln ('Consultar Evento     -> 3');
Readln (ressubmenu);
end;
procedure xcontactos;
begin
Writeln ('Inserir Contacto       -> 1');
Writeln ('Modificar Contacto     -> 2');
Writeln ('Consultar Contactos    -> 3');
end;
procedure xdadospessoais;
begin
Writeln ('Inserir Dado       -> 1');
Writeln ('Modificar Dado     -> 2');
Writeln ('Consultar Dados    -> 3');
end;
procedure xPerfil;
begin
Writeln ('Modificar Informacao  -> 1');
Writeln ('Consultar Informacao  -> 2');
end;
procedure inserirevento;
begin
If existeficheiroagenda then
Reset (fichagenda)
else
Rewrite (fichagenda);
Write ('Nome: ');
Readln (agenda.acontecimento1);
Write ('Data: ');
Readln (agenda.dataacont1);
Write (fichagenda, agenda);
Close (fichagenda);
end;
procedure modificarevento;
begin
If not existeficheiroagenda then
begin
Writeln ('qualquer tecla');
Readln;
end
else
Reset (fichagenda);
Writeln ('Qual evento quer modificar?');
Readln (N);
Seek (fichagenda, N-1);
Read (fichagenda, agenda);
Writeln (agenda.acontecimento1);
writeln(agenda.dataacont1);
Write ('Novo evento: ');
Read (agenda.acontecimento1);
Write ('Nova data: ');
Readln (agenda.dataacont1);
Write (fichagenda, agenda);
Close (fichagenda);
end;

procedure consultarevento;
begin
If not existeficheiroagenda then
begin
Writeln ('Ficheiro nao existe - qualquer tecla para continuar');
Readln;
end
else
Reset (fichagenda);
While not eof (fichagenda) do
begin
Read (fichagenda, agenda);
Writeln (agenda.acontecimento1);
Writeln (agenda.dataacont1);
end;
end;

{$IFDEF WINDOWS}{$R cofre_pessoal.rc}{$ENDIF}

begin
Repeat
menu;
If (resmenu='1') then
begin
xagenda;
       If (ressubmenu='1') then
       inserirevento;
       If (ressubmenu='2') then
       modificarevento;
       If (ressubmenu='3') then
       consultarevento;
end;
Until (resmenu='0');
end.

Share this post


Link to post
Share on other sites
cysco

Basta correrem o programa e vêm o erro que dá, para verem se têm alguma ideia do que se passa.

Eu penso que o programa não consegue aceder ao ficheiro, para modificar/ler dados.

Se desse para darem alguma ideia ainda hoje agradecia, porque tenho de acabar o programa e estou encravado nesta parte.  :down:

Share this post


Link to post
Share on other sites
thoga31

Boas cysco 😎

Já tentei correr o programa e já estive a analisar o código, e de facto ainda não encontrei o erro.

Infelizmente, acho que não vou conseguir achar a resposta ainda hoje... Se eu tivesse mais um tempo, ainda analisava isto com mais cuidado, mas esta é para mim uma semana muito complicada em relação a testes e trabalhos :wallbash:

Boa sorte, se for mesmo para hoje! Eu, no entanto, vou procurar o erro e tentarei resolvê-lo!

Desculpa não te poder ajudar mais. :)

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco

Pois não é para hoje, mas enquanto não descobrir o erro não avanço desta parte e ainda me falta muito.

De qualquer das maneiras obrigado pela tua resposta  :)

Share this post


Link to post
Share on other sites
cysco

Basta correrem o código pessoal, e vejam se têm ideia do porquê de não conseguir ler os dados do ficheiro.

É que aquele erro é mesmo estupido.. Não consigo avançar no programa, e tenho mesmo de entregar isto  :bored:

Share this post


Link to post
Share on other sites
thoga31

Ora, segundo os meus testes, o programa falha somente neste código:

Seek (fichagenda, N-1);

Mas, sinceramente, não sei o que ele faz. Podes-me explicar?

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco

O programa é como se fosse um cofre teu, onde tens a tua agenda para inserires eventos, colacares o teus dados pessoais no perfil, contactos..

Pois mas esse erro creio que apenas se aplica ao modo modificar, não percebo qual o problema de ele não ler os dados que guarda anteriormente no ficheiro.

Tenho de entregar isto quarta-feira  :D vou tentar fazer outro diferente, não posso ter 0.

Obrigado na mesma por teres revisto o codigo  :confused: Já agora tens alguma sugestão para um programa ? (tem de trabalhar com ficheiros)

Share this post


Link to post
Share on other sites
thoga31

O programa é como se fosse um cofre teu, onde tens a tua agenda para inserires eventos, colacares o teus dados pessoais no perfil, contactos..

Desculpa, não fui claro. Eu percebi o que faz o programa, não percebi aquele código, nunca o vi na vida.

Tenho de entregar isto quarta-feira  :D vou tentar fazer outro diferente, não posso ter 0.

Obrigado na mesma por teres revisto o codigo  :confused: Já agora tens alguma sugestão para um programa ? (tem de trabalhar com ficheiros)

Tem que trabalhar com ficheiros... Mas pode ser só gravar, ou é obrigatório gravar, ler e modificar? E existe algum "tema" específico para fazer o programa, ou tem de ser um cofre?

Penso que possa ter ideias para isso...


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco

Tem de gravar, ler e modificar, com um tema à escolha  :confused:

Se calhar aquele estava demasiado confuso, talvez uma coisa mais simples..

Share this post


Link to post
Share on other sites
thoga31

Olha, uma coisa mais simples poderá ser um editor de texto básico. Escreves o nome do ficheiro, ele acrescenta a extensão TXT por si, e depois é só criar, consultar e editar. Será necessária a utilização de um ficheiro auxiliar para facilitar a edição. Se me deres até amanhã à noite, vou desenvolvendo o código e posto aqui uma sugestão. Pode ser? É o melhor que me vem à cabeça...

Cumpz


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco

Até amanhã à noite é complicado porque depois só tenho essa noite para terminar  :confused:

Mas gostei da tua ideia pá ! Muito porreiro.

Se não diz-me as tuas ideias gerais que eu começo a fazer os menus e afins ..

Share this post


Link to post
Share on other sites
thoga31

Ok, eu já comecei a fazer o programa, e já tenho os menus operacionais. Contudo, não tenho mais tempo hoje...

Aqui fica a ideia, então:

O programa dá para criar, consultar e editar ficheiros de formato TXT.

O programa vai-te perguntar o nome do ficheiro, e tu escreves, e ele adiciona o formato:

nome:=nome+'.txt';

De seguida, ele analisa se o ficheiro existe ou não, através de uma função.

if existeficheiro then begin

end;

No caso da criação de ficheiros, se NÃO existir ficheiro, ele cria. No caso de HAVER, ele dá o aviso e cancela a operação.

Já no caso da consulta e da edição, no caso de EXISTIR, ele vai abri-los e, respectivamente, mostrar o seu conteúdo por linha e vai editar o conteúdo por linha que nós seleccionemos:

while NOT eof(fich) do begin
      i:=i+1;
      readln(fich,line);
      writeln('Linha ',i,': ',line);
end;

write('Pretende editar uma linha? (S/N) '); readln(opt2);
if upcase(char(opt2))='S' then begin
   write('Linha a reescrever: '); readln(j);

Quanto aos códigos para o programa saber o que editar, ainda não os fiz, mas deixo a ideia:

[*]Criar um ficheiro auxiliar, que seja uma cópia do original.

[*]Reescrever o ficheiro original, copiando a pouco e pouco o auxiliar, e, através de um contador, quando se chegar à linha pretendida, o programa pára e pede o novo conteúdo dessa linha, debitando o novo texto directamente no original, e depois copia o resto.

[*]Repetir o processo até não se querer editar mais linhas.

Não sei se fui muito claro, mas não consigo explicar melhor... (já estou bastante cansado, agora)

Dúvidas, coloca  😎

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco
Quanto aos códigos para o programa saber o que editar, ainda não os fiz, mas deixo a ideia:

    * Criar um ficheiro auxiliar, que seja uma cópia do original.

    * Reescrever o ficheiro original, copiando a pouco e pouco o auxiliar, e, através de um contador, quando se chegar à linha pretendida, o programa pára e pede o novo conteúdo dessa linha, debitando o novo texto directamente no original, e depois copia o resto.

    * Repetir o processo até não se querer editar mais linhas.

Isto não estou a perceber como fazer  🤔

Apenas sei que se se uso um ciclo repeat .. until (não querermos editar mais)

Olha dava para me passares o código que já tens ? (mesmo que seja pouco para ver)

Share this post


Link to post
Share on other sites
thoga31

Isto não estou a perceber como fazer  🤔

Apenas sei que se se uso um ciclo repeat .. until (não querermos editar mais)

Olha dava para me passares o código que já tens ? (mesmo que seja pouco para ver)

O processo base de edição é o seguinte:

[*]Copiar Original -> Auxiliar

[*]Reiniciar Original com REWRITE

[*]Perguntar qual a linha a editar

[*]Começar a copiar a pouco e pouco, Auxiliar -> Original, e, quando chega à LINHA, pedir o novo conteúdo

Em código, a base é a seguinte:



assign(ficheiro,nome);  // var nome,nome_aux:string;
nome_aux:='aux_'+nome;  // nome_aux = aux_NOME.txt');  nome = NOME.txt (nome+'.txt')
assign(auxiliar,nome_aux);
reset(ficheiro);
rewrite(auxiliar);

while NOT eof(ficheiro) do begin
  readln(ficheiro,linha);  // var linha:string;
  writeln(aux,linha);
  writeln('Linha ',i,': ',linha);
end;

close(ficheiro);
close(auxiliar);

writeln('Qual a linha a editar:'); readln(lin);  // var lin:integer;

assign(ficheiro,nome);
assign(auxiliar,nome_aux);

i:=0;  // var i:integer;
while NOT eof(auxiliar) do begin
  i:=i+1;
  readln(auxiliar,linha);
  if (i=lin) then begin
      writeln('Novo conteudo da linha ',i,'?'); readln(linha);
  end;
  writeln(ficheiro,linha);
end;

close(ficheiro);
close(auxiliar);

Espero ter ajudado nesta parte. Alguma dúvida, diz. :confused:


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco

Até agora tá tudo entendido  :confused:

Tinhas dito que já tinhas os menus operacionais, se desse para os colocares também para eu começar a montar isto eheh

Share this post


Link to post
Share on other sites
thoga31

Tinhas dito que já tinhas os menus operacionais

Eu fiz o menu baseado em procedimentos:

repeat
     repeat
          writeln('EDITOR DE TEXTO - Menu Principal');
          writeln;
          writeln('1 - Criar');
          writeln('2 - Ver');
          writeln('3 - Editar');
          writeln('0 - Sair');
          writeln;
          write('Opcao: '); readln(opcao);
     until opcao in ['0'..'3'];

     if char(opcao)='1' then criar;  // Procedure criar;
     if char(opcao)='2' then ver;  // Procedure ver;
     if char(opcao)='3' then editar;  // Procedure editar;

until (opcao='0');  // var opcao:char;


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco
while  NOT eof(ficheiro) do begin

  readln(ficheiro,linha);  // var linha:string;

  writeln(aux,linha);

  writeln('Linha ',i,': ',linha);

end;

Não percebi aqui  :D a variável linha como é ? ele escreve no ficheiro com um ciclo for ?

linha para mudares de linha no ficheiro tens de mandar escrever writeln certo ? essa variavel serve para o programa todo?

Dúvida resolvida  :P

Já terminei, mas na parte do modificar dá erro.

Optei por não usar um ficheiro auxiliar não sei se será esse o problema..  :confused:

Abaixo fica o código para conferires:

miniword;

var nome, line:string;
res:integer; opt1:char;
fich: Text;

function existeficheiro: boolean;
begin
assign (fich, 'modulo7.txt');
{$I-};
Reset (fich);
Close (fich);
{$I+};
existeficheiro:=(IoResult=0);
end;

procedure criar;
var i:integer;
begin
i:=0;
       if existeficheiro then  begin
       Writeln ('Ficheiro ja existente - clique para voltar ao menu');
       Readln;
       end
       else
       begin
       Rewrite (fich);
       Write ('Numero de linhas : ');
       Readln (res);
       Repeat
       i:=i+1;
       write('Linha ',i,': ');
       readln (line);
       writeln(fich,line);
       until (i=res);
       Close (fich);
       end;
       end;

procedure ver;
var i:integer;
begin
i:=0;
If not existeficheiro then begin
Writeln ('Ficheiro inexistente');
Readln;
end
else
Reset (fich);
while  NOT eof(fich) do begin
      i:=i+1;
      readln(fich,line);
      writeln('Linha ',i,': ',line);
end;
Close (fich);
Writeln;
end;

procedure editar;
var i:integer;
begin
i:=0;
If not existeficheiro then begin
Writeln ('Ficheiro inexistente');
Readln;
end
else
begin
Reset (fich);
write('Linha a reescrever: ');
readln(res);
while NOT eof(fich) do begin
   i:=i+1;
   readln(fich,line);
   if (i=res) then begin
      write('Novo conteudo da linha ',i,':');
      readln(line);
   end;
   writeln(fich,line);
end;
Close (fich);
Writeln;
end;
end;

begin
repeat
     repeat
          writeln('MiniWord');
          writeln;
          writeln('Criar   -> 1');
          writeln('Ver     -> 2');
          writeln('Editar  -> 3');
          writeln('Sair    -> 4');
          write('        -> ');
          readln(opt1);
     until opt1 in ['0'..'3'];

     if char(opt1)='1' then criar;
     if char(opt1)='2' then ver;
     if char(opt1)='3' then editar;

until (opt1='0');
end.

Share this post


Link to post
Share on other sites
thoga31

Boas cysco!

Desculpa, só agora pude ver... Poderei analisar o código, mas já terminei o meu Editor de Texto, e estou a pensar colocá-lo no Armazém de Código, para quem necessitar no futuro, juntamente com um documento sobre edição de ficheiros de texto. Talvez depois de amanhã consiga postar isso.

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
cysco

Boas  thoga31;

Não faz mal, terminei o trabalho ontem à noite, já entreguei hoje.

Se quiseres posso-te enviar o meu código e tu juntas ou 2 num só e poderíamos colocar no armazém de código depois  :confused:

Digamos que acabei por inserir algumas coisas interessantes e seriam engraçado ver os 2 num só!

Se tiveres insteressado manda PM, pois não sentido a continuação deste tópico, uma vez que já não tem nada a ver com o assunto original. Se os moderadores assim o entenderem podem encerrar este tópico.  :D

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
Sign in to follow this  

×

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.