Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

cysco

Erro na leitura de ficheiro

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cysco

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

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.