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  :hmm:

(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 :ipool:

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! | Occasional Fortnite player

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
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! | Occasional Fortnite player

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! | Occasional Fortnite player

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  :ipool:

Cumpz.


Knowledge is free! | Occasional Fortnite player

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  :hmm:

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  :hmm:

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! | Occasional Fortnite player

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! | Occasional Fortnite player

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! | Occasional Fortnite player

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.