Jump to content
Faustino

Erro na leitura de ficheiros

Recommended Posts

Faustino

Fiz este programa em pascal:

Program Pzim ;
type pessoa=record
  nome:string;
  idade:integer;
end;
var f:file of pessoa;
    p:pessoa;
    x:integer;
Begin
     assign(f,'pessoa.dat');
     {$I-}
         reset(f);
         if ioresult<>0 then
          rewrite(f);
     {$I+}        
     repeat
           write('Insira o nome: ');
           readln(p.nome);
           if upcase(p.nome)<>'FIM' then
             begin
                  write('Idade: ');
                  readln(p.idade);
                  write(f,p);
             end;
             writeln;
     until upcase(p.nome)='FIM';
     close(f);
         reset(f);
     clrscr;
     gotoxy(1,1);
     write('Nome');
     gotoxy(35,1);
     write('Idade');
     x:=3;  
     while not eof(f) do
       begin 
            read(f,p);
            gotoxy(1,x);
            write(p.nome);
            gotoxy(35,x);
            write(p.idade);
            x:=x+1;
       end;
     close(f);
  
End.

Entretanto quando é para listar os dados da lista, alem de o primeiro de sobrepor ao anterior, ele apenas mostra 5 dos dados presentes no ficheiro.

Conseguem ajudar?

Feito no Pascalzim 6.0.3

Share this post


Link to post
Share on other sites
nunopicado

Não consegui reproduzir o erro...
Aqui esse código funciona correctamente sem qualquer alteração.


"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
BHAMF

Tente mudar ali, quando na leitura, em vez de read, use readln... e nos diga o resultado.

Agora, BHAMF disse:

Tente mudar ali, quando na leitura, em vez de read, use readln... e nos diga o resultado.

e coloque writeln; embaixo do write.


Brenio Hallison A.M. Filho

 

Share this post


Link to post
Share on other sites
Faustino

p.png?fv_content=true&size_mode=5p.png?fv_content=true&size_mode=5p.png?fv_content=true&size_mode=5p.png?fv_content=true&size_mode=5

9 horas atrás, BHAMF disse:

Tente mudar ali, quando na leitura, em vez de read, use readln... e nos diga o resultado.

e coloque writeln; embaixo do write.

 

Em 12/06/2019 às 18:17, Faustino disse:

Fiz este programa em pascal:


Program Pzim ;
type pessoa=record
  nome:string;
  idade:integer;
end;
var f:file of pessoa;
    p:pessoa;
    x:integer;
Begin
     assign(f,'pessoa.dat');
     {$I-}
         reset(f);
         if ioresult<>0 then
          rewrite(f);
     {$I+}        
     repeat
           write('Insira o nome: ');
           readln(p.nome);
           if upcase(p.nome)<>'FIM' then
             begin
                  write('Idade: ');
                  readln(p.idade);
                  write(f,p);
             end;
             writeln;
     until upcase(p.nome)='FIM';
     close(f);
         reset(f);
     clrscr;
     gotoxy(1,1);
     write('Nome');
     gotoxy(35,1);
     write('Idade');
     x:=3;  
     while not eof(f) do
       begin 
            read(f,p);
            gotoxy(1,x);
            write(p.nome);
            gotoxy(35,x);
            write(p.idade);
            x:=x+1;
       end;
     close(f);
  
End.

Entretanto quando é para listar os dados da lista, alem de o primeiro de sobrepor ao anterior, ele apenas mostra 5 dos dados presentes no ficheiro.

Conseguem ajudar?

Feito no Pascalzim 6.0.3

Já tentei mudar os write e os read para writeln e readln e o erro continua o mesmo:

Insiro por exemplo pedro, joao e eduardo, clico enter para listar e ele lista os 3 nomes, de seguida listo mais dois nomes, ricardo e gonçalo, e o que acontece quando vai listar é que, so aparece os dois que acabei de inserir e o ultimo que inseri da outra vez.

 

Share this post


Link to post
Share on other sites
passarito

O que me dá a ideia é que ele está sempre a criar o ficheiro de dados.

Faz o seguinte para testares:

{$I-}
	reset(f);
	if ioresult<>0 then begin
		rewrite(f);
		writeln('Criei ficheiro');
	end
	else begin
		writeln('Abri ficheiro');
	end;
{$I+}        

Assim vais conseguir saber se o ficheiro foi aberto ou criado de novo

Share this post


Link to post
Share on other sites
antseq

Viva,

Se queres começar sempre com um ficheiro (registos) vazio, penso que só precisas disto:

     {$I-}
         rewrite(f);
     {$I+}        

Se queres manter os registos na sessão anterior, acrescenta o "Seek(f,Filesize(f));"

     {$I-}
         reset(f);
         if ioresult<>0 then
          rewrite(f);
         Seek(f,Filesize(f));
     {$I+}  

Cps,

  • Vote 1

Share this post


Link to post
Share on other sites
passarito
1 hora atrás, antseq disse:

Viva,

Se queres começar sempre com um ficheiro (registos) vazio, penso que só precisas disto:


     {$I-}
         rewrite(f);
     {$I+}        

Se queres manter os registos na sessão anterior, acrescenta o "Seek(f,Filesize(f));"


     {$I-}
         reset(f);
         if ioresult<>0 then
          rewrite(f);
         Seek(f,Filesize(f));
     {$I+}  

Cps,

Xiiiii , esqueci-me do seek... também já lá vão muitos anos que não trabalho com o Pascal.

Good Work @antseq

 

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.