I cannot change a record in a Pascal . dat file

Asked

Viewed 203 times

1

I’m doing an exercise for school and I can’t get the program to rent and return cars. Whenever I try to do this the program breaks (crash) and I don’t understand why.

Follows code:

Program cargest;
uses crt;
Type frota=Record
     Marca:string[19];
     Modelo:string[15];
     Combustivel:string[13];
     AC:string[1];
     Ano:integer;
     Matricula:string[8];
     Custo:real;
     estado:boolean;
     flag:boolean;
end;

var lista,tmp: file of frota;
var veiculos:frota;
    op,n,c:integer;
    op1:char;

Function existeficheiro: boolean;
begin
assign(lista, 'C:\Users\Andr?\Desktop\cargest.dat')
     {$I-};
     reset(lista);close(lista);
     {$I+};
     existeficheiro:= (Ioresult=0);
end;


Procedure introduzir;
var op1:char;
begin
     clrscr;
     writeln('INTRODUCAO DE NOVO VEICULO');

        op1:='s';
             while (op1 <> 'n') and (op1 <> 'N') do begin
               if existeficheiro then
                reset (lista)
     else

     rewrite(lista);
     writeln;
     {write('Numero de Novos Veiculos: ');readln(n);
     for c:=1 to n do}
     begin
          writeln;
          writeln('Registo numero: ',filesize(lista));
          write('Marca: ');readln(veiculos.marca);
          write('Modelo: ');readln(veiculos.modelo);
          write('Combustivel: ');readln(veiculos.combustivel);
          write('Ar Condicionado (s/n): ');readln(veiculos.ac);
          write('Ano: ');readln(veiculos.ano);
          write('Matricula: ');readln(veiculos.matricula);
          write('Custo de aluguer diario: ');readln(veiculos.custo);
          veiculos.flag:=true;
          veiculos.estado:=true;
          seek(lista,filesize(lista));
          write(lista,veiculos);
          writeln;
     end;
     write('Deseja continuar? (s/n) ');
             read(op1);
             readln;
     close(lista);
end;
end;

Procedure listagem_disp;
begin
     clrscr;
     if not existeficheiro then
     begin
          writeln('Nao ha veiculos na frota');
          writeln('Tecle Enter para Menu');
          repeat until ReadKey=#13
     end
     else
     begin
          reset(lista);
          writeln('FROTA DISPONIVEL');
          writeln;
          writeln('Existem ',filesize(lista), ' veiculos na garagem');
          writeln;
          while not eof(lista) do
          begin
               read(lista,veiculos);
               if veiculos.estado=true then
                begin
                     writeln();
                     writeln('Registo numero ',Filepos(lista));
                     writeln('Marca:',veiculos.marca);
                     writeln('Modelo:',veiculos.modelo);
                     writeln('Combustivel: ',veiculos.combustivel);
                     writeln('Ar Condicionado (s/n):',veiculos.ac);
                     writeln('Ano:',veiculos.ano);
                     writeln('Matricula:',veiculos.matricula);
                     writeln('Custo:',veiculos.custo);
                     writeln();
                end;
          end;
     close(lista);
     writeln;
     writeln('Tecle Enter para Menu');
     repeat until ReadKey=#13
     end;
end;

Procedure Listagem_alug;
begin
     clrscr;
     if not existeficheiro then
     begin
          writeln('Ficheiro inexistente');
          writeln('Tecle Enter para Menu');
          repeat until ReadKey=#13
     end
     else
        begin
          reset(lista);
          writeln('FROTA ALUGADA');
          writeln;
          writeln('Existem ',filesize(lista), ' veiculos alugados');
          writeln;
          while not eof(lista) do
          begin
               read(lista,veiculos);
               if veiculos.estado=false then
                begin
                     writeln();
                     writeln('Registo numero ',Filepos(lista));
                     writeln('Marca:',veiculos.marca);
                     writeln('Modelo:',veiculos.modelo);
                     writeln('Combustivel: ',veiculos.combustivel);
                     writeln('Ar Condicionado (s/n):',veiculos.ac);
                     writeln('Ano:',veiculos.ano);
                     writeln('Matricula:',veiculos.matricula);
                     writeln('Custo:',veiculos.custo);
                     writeln();
                end;
          end;
     close(lista);
     writeln;
     writeln('Tecle Enter para Menu');
     repeat until ReadKey=#13
     end;
end;

Procedure Listagem_geral;
begin
     clrscr;
     if not existeficheiro then
     begin
          writeln('Ficheiro inexistente');
          writeln('Tecle Enter para Menu');
          repeat until ReadKey=#13
     end
     else
        begin
          reset(lista);
          writeln('FROTA COMPLETA');
          writeln;
          writeln('Existem ',filesize(lista), ' veiculos na frota.');
          writeln;
          while not eof(lista) do
          begin
               read(lista,veiculos);
                begin
                     writeln();
                     writeln('Registo numero ',Filepos(lista));
                     writeln('Marca:',veiculos.marca);
                     writeln('Modelo:',veiculos.modelo);
                     writeln('Combustivel: ',veiculos.combustivel);
                     writeln('Ar Condicionado (s/n):',veiculos.ac);
                     writeln('Ano:',veiculos.ano);
                     writeln('Matricula:',veiculos.matricula);
                     writeln('Custo:',veiculos.custo);
                     writeln();
                end;
          end;
     close(lista);
     writeln;
     writeln('Tecle Enter para Menu');
     repeat until ReadKey=#13
     end;
end;

Procedure eliminacao;
begin
clrscr;
         if not existeficheiro then
         begin
            writeln('ficheiro inexistente');
            writeln('tecle entre para menu');
            repeat until readkey=#13
            end
           else
              begin
               reset(lista);
               writeln('Existem ',filesize(lista),' veiculos na frota!');
                op1 := 's';
                while op1 = 's' do
                begin
                 writeln;
                 write('introduza o numero do registo que quer eliminar: ');
                 readln(n);
                 seek ( lista,(n-1));
                 read (lista, veiculos);
                 writeln('Info do Veiculo Selecionado');
                 writeln(veiculos.marca,' ',veiculos.modelo,' de ',veiculos.ano);
                 writeln('Clique enter para cofirmar operacao.');
                 readln;
                 writeln;
                 writeln('Veiculo elimando da frota com sucesso!');
                 veiculos.flag:=false;
                 seek(lista,(n-1));
                 write(lista,veiculos);
                 writeln;
                 write('Digite <s> para eliminar outro veiculo ou ENTER para voltar ao Menu');
                 readln(op1);
                end;
               end;
               close(lista);
               assign(TMP,'C:\Users\Andr?\Desktop\temporario.dat');
               rewrite(TMP);
               reset(lista);
               seek(TMP,0);
               while not eof(lista) do
               begin
                    read(lista,veiculos);
                    if veiculos.flag = true then
                       write(TMP,veiculos);
                    end;
                    close(lista);
                    close(tmp);
                    erase(lista);
                    rename(TMP,'C:\Users\Andr?\Desktop\cargest.dat');
                    writeln;
                    {writeln('tecle enter para menu');
                    repeat until readkey=#13}
        end;
Procedure aluga;
begin
 clrscr;
     If Not ExisteFicheiro Then
     Begin
          Writeln('Ficheiro inexistente');
          Write ('Tecle Enter para Menu');
          Repeat Until ReadKey=#13
     End;
     begin
          Writeln;
          Write ('                    Introduza o numero do veiculo a alugar: ');
          read (n);
          Seek (lista, (n));
          Read (lista, veiculos);
           if veiculos.estado = false then
           begin
                gotoxy (20,13);
                writeln ('Veiculo Indisponivel, Tente Novamente.');
                readln;
                 clrscr;
           end
           else
           begin
          writeln (veiculos.marca,' ', veiculos.modelo,' de ', veiculos.ano) ;
          writeln('Clique enter para confirmar a opera??o');
          readln;
          writeln;
          veiculos.estado := false;
          Seek (lista, (n));
          Write (lista, veiculos);
          writeln;
          writeln ('Veiculo Alugado com sucesso!');
          close(lista);
          end;
     end;

close(lista);
writeln;
Writeln ('Tecle Enter para Menu');
Repeat Until ReadKey=#13;
end;

Procedure devolve;
begin
     clrscr;
     If Not ExisteFicheiro Then
     Begin
          Writeln('Ficheiro inexistente');
          Write ('Tecle Enter para Menu');
          Repeat Until ReadKey=#13
     End;
     begin
          Writeln;
          Writeln ('Introduza o numero do veiculo a devolver: ');
          readln (n);
          Seek (lista, (n));
          Read (lista, veiculos);
          writeln (veiculos.marca,' ', veiculos.modelo,' de ', veiculos.ano);
          Writeln('Efectue o pagamento do custo do aluguer');
          writeln('A pagar: ',veiculos.custo);
          writeln;
          veiculos.estado := true;
          Seek (lista, (n));
          Write (lista, veiculos);
          writeln;
          writeln ('Veiculo Devolvido com sucesso!');
     end;
     Close(lista);
writeln;
Writeln ('Tecle Enter para Menu');
Repeat Until ReadKey=#13
end;

begin
     clrscr;
     textbackground(blue);
     clrscr;
     gotoxy(20,3);
     write('CarGest v5.0');
     op:=1;
     while op <> 0 do
     begin
          clrscr;
          gotoxy(20,6);
          write('CARGEST v6.0');
          gotoxy(15,8);
          write('1 - Introduzir Veiculo na Frota');
          gotoxy(15,9);
          write('2 - Alugar um veiculo');
          gotoxy(15,10);
          write('3 - Devolver veiculo');
          gotoxy(15,11);
          write('4 - Visualizar Frota');
          gotoxy(15,12);
          write('5 - Visualizar Veiculos Alugados');
          gotoxy(15,13);
          write('6 - Visualizar Veiculos Disponiveis');
          gotoxy(15,14);
          write('7 - Eliminar Veiculos');
          gotoxy(15,15);
          write('0 - SAIR');
          gotoxy(15,18);
          write('SELECIONE A OPCAO: ');
          readln(op);
                     case op of
                          1   : introduzir;
                          2   : aluga;
                          3   : devolve;
                          4   : Listagem_geral;
                          5   : Listagem_alug;
                          6   : Listagem_disp;
                          7   : Eliminacao;

                      else
                          begin
                               gotoxy(15,18);
                               clrscr;
                               textbackground(red);
                               textcolor(White);
                               clrscr;
                               gotoxy(23,15);
                               write('     OPCAO INVALIDA');
                               gotoxy(23,17);
                               write('Prima enter para continuar');
                               textbackground(blue);

                               readln;
                           end;
                           end;
                        end;

end.
  • 2

    .dat It is not a specific format, it does not inform the type of data, I will assume that it is a format that you "invented". A doubt, which "compiler" are you using? There is a "debugger" in the tool you are using?

  • Yes, a format invented so to speak. I am using Dev-Pascal and the compilation does not point out errors. It works everything but the "return" procedure and the "rent" procedure. By the way, Thank you so much for editing!

  • So A.Barbosa, I have no knowledge of pascal (I believe the compiler is freepascal), although I have a vague knowledge of Object-pascal, so at the moment I cannot point out the problem, but as soon as possible I will analyze. I personally think the problem is in reset(lista);, he is trying to reset a variable without data (although there is a var nothing was attributed to him).

  • The error is in Seek(list).

1 answer

-1

Then @A.Barbosa I opened your code by Pascalzim version 6.0.3b4

Here he points out the error in Rent:

Alugar

And here’s the mistake in returning:

Devolver

In both cases the pointed error is in the line where the variable 'Seek' should call the List , which I imagine is your list of the supposed file with extension .dat. I suppose if there it bug at this time Voce calls this list, maybe Voce should not invent the type of extension and test with a known extension.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.