Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Pascal] Rekordy - zapis i odczyt z plików.

Retran 27 Wrz 2010 19:03 6099 3
  • #1 27 Wrz 2010 19:03
    Retran
    Poziom 9  

    Witam!
    W związku z tym, że nie zaliczyłem przez ten jeden program muszę prosić o poradę jak to ma w ogóle działać.

    Poniższą wersję napisałem na zaliczeniu i jak się łatwo domyśleć... została odrzucona. Wskazówki co było źle są w kodzie. Proszę o pomoc w poprawie.

    Program ma zapisywać wpisywane rekordy do pliku dane.txt, osoby z ocenami pow. 3 ma zapisywać do pliku best.txt, a następnie odczytać wyniki z dane.txt i wyświetlić je na ekranie.



    Code:
    program rec;
    
    uses crt;

    type
      osoba=record
       imie:string[15];
       nazwisko:string[15];
       ocena:integer;
      end;


    var
      plik:file of osoba;
      plik2:file of osoba;
      dane:array[1..100] of osoba;   // - tego podobno ma nie być
      i,j:integer;
      a:string[1];

    begin
     clrscr;
     a:='t';
     i:=0;

     assign(plik,'dane.txt');
     assign(plik2,'best.txt');
     rewrite(plik);rewrite(plik2);


      repeat
      begin
         i:=i+1;

         write('Imie: ');
         readln(dane[i].imie);  // - nie wiem jak to ma działać wszystko, ale wyrzucenie
         write('Nazwisko: ');   // powyższej tablicy spowoduje bezsensowność dane[i]
         readln(dane[i].nazwisko);
         write('Ocena: ');
         readln(dane[i].ocena);
         write(plik,dane[i]);

         if dane[i].ocena>3 then
         write(plik2,dane[i]);


      writeln('Chcesz kontynuować pisanie [T/N]: ');
      readln(a);
      end
      until a='n';


    close(plik);
    close(plik2);

    //-------------odczyt---------------

     writeln;
     ClrScr;
     assign(plik, 'dane.txt');
     reset(plik);
    j:=i;
     while not Eof(plik) Do
       read(plik,dane[i]);
       for i:=1 to j do    // w tym miejscu mój prof. kolejny raz wspomniał o                     
           begin               // bezsensowności tego zapisu, więc jak przeskakiwać na
              writeln(dane[i].nazwisko,' ',        // kolejne rekordy?
              dane[i].imie,' ',dane[i].ocena);
              writeln('*************************');
              writeln;
           end;

    close(plik);

     readln;
    end.


    jeśli ktoś ma jakąś podpowiedź lub może konstruktywnie mnie zrugać za błędy to będę wdzięczny ;)

    0 3
  • Pomocny post
    #3 27 Wrz 2010 21:01
    arnoldziq
    Moderator Programowanie

    Przemyśl może taki kod :

    Code:
    program rec;
    
    uses crt;

    type
      osoba = record
       imie     : string[15];
       nazwisko : string[15];
       ocena    :integer;
      end;

    var
      plik   : file of osoba;
      plik2  : file of osoba;
      uczen  : osoba;
      a      : char;
    begin
     clrscr;

     assign(plik,'dane.txt');
     assign(plik2,'best.txt');
    {$I-}
     rewrite(plik);rewrite(plik2);
    {$I+}

      repeat
         write('Imie: ');
         readln(uczen.imie);
         write('Nazwisko: ');
         readln(uczen.nazwisko);
         write('Ocena: ');
         readln(uczen.ocena);

         seek(plik,filesize(plik));
         write(plik,uczen);

         if uczen.ocena>3 then
         begin
           seek(plik2,filesize(plik2));
           write(plik2,uczen);
         end;

         write('Chcesz kontynuowac pisanie [T/N]: ');
         readln(a);
      until (a='n') or (a='N');

     close(plik);
     close(plik2);


     ClrScr;
     assign(plik, 'dane.txt');
     reset(plik);
     while not Eof(plik) Do
      begin
       read(plik,uczen);
       writeln(uczen.nazwisko,' ',
               uczen.imie,' ',
               uczen.ocena);
       writeln('*************************');
      end;
     close(plik);
     readln;
    end.

    2
  • #4 27 Wrz 2010 21:58
    Retran
    Poziom 9  

    wielkie dzięki arnoldziq - myślę, że tak to powinno wyglądać.

    Co do wcześniejszego pytania to typy wskaźnikowe były w innym dziale, który już wcześniej zaliczyłem, więc tutaj nie miały być używane.

    W każdym razie, myślę, że rozwiązanie już mam! :)
    Połączenie seek i filesize daje to co potrzeba :)
    Próbowałem wcześniej z funkcją append, które w teorii powinno działać, ale na FPC nie hula :)

    1