Zapis wskaźnika do pliku elementowego.

0

Napisałem poniższy kod:

program wejscie;
uses crt;

type
   skladnik_listy2 = ^zapis;
   zapis = record
            wsk1 : skladnik_listy2;
            imie : string[20];
            nazw : string[30];
            nr_tel : string[20];
            opis : string;
            wsk2 : skladnik_listy2;
           end;
   dostep = record
              haslo : string[15];
            end;

var plik : file of dostep;
    zmHaslo : dostep;
    kapsulka : string[15];

    plik2 : file of skladnik_listy2;
    skladnik_biezacy, pierwszy_skladnik : skladnik_listy2;

procedure intro;

begin

  textbackground(blue);
  clrscr;
  textcolor(yellow);
  gotoxy(20,1);
  writeln('Rozpoczynam program "Notatnik".');
  delay(1000);
  gotoxy(20,3);
  writeln('Achieved with CryEngine4 and DevPascal.');
  delay(1000);
  gotoxy(20,5);
  writeln('Developer/owner : rNest. ');
  delay(1000);
  gotoxy(20,7);
  writeln('Kliknij ENTER aby kontynuowa'+#134+' ...');

end;

procedure utworzPlik(var kapsulka : string);

begin
  assign(plik, 'C:\sec\plikHa1345917.dat');
  rewrite(plik);
    zmHaslo.haslo := 'jula';
    kapsulka := zmHaslo.haslo;
    readln(zmHaslo.haslo);
    write(plik, zmHaslo);
  close(plik);
end;

procedure sprawdzHaslo(kapsulka : string);
var hasloUser : string[15];
    koniec : boolean;
begin

  koniec := false;
  window(20,2,50,5);
  textbackground(yellow);
  clrscr;

  window(21,3,49,4);
  textbackground(blue);
  clrscr;


  repeat
    writeln('Wpisz has'+#136+'o dost'+#169+'powe : ');
    readln(hasloUser);
    if hasloUser = kapsulka then
      begin
        sound(2000);
        koniec := true;
      end;
    clrscr;
  until koniec;

end;

procedure zapiszRekord(var skladnik_biezacy : skladnik_listy2; var pierwszy_skladnik : skladnik_listy2);
var poprzedni_skladnik, nastepny_skladnik : skladnik_listy2;
begin
    assign(plik2, 'C:\notatnik\notatnik.dat');
    rewrite(plik2);

       if skladnik_biezacy <> nil then poprzedni_skladnik := skladnik_biezacy
         else
           begin
              poprzedni_skladnik := nil;
              nastepny_skladnik := nil;
           end;

           new(skladnik_biezacy);

                  writeln('Wpisz imie:');
                  read(skladnik_biezacy^.imie);

                  writeln('Wpisz nazwisko:');
                  read(skladnik_biezacy^.nazw);

                  writeln('Wpisz nr telefonu:');
                  read(skladnik_biezacy^.nr_tel);

                  writeln('Wpisz opis dodatkowy:');
                  read(skladnik_biezacy^.opis);

                  skladnik_biezacy^.wsk1 := poprzedni_skladnik;
                  read(skladnik_biezacy^.wsk1);
                  skladnik_biezacy^.wsk2 := nastepny_skladnik;
                  read(skladnik_biezacy^.wsk2);

                  write(plik2, skladnik_biezacy);

           poprzedni_skladnik := skladnik_biezacy;
    close(plik);


end;

BEGIN

  intro;
  utworzPlik(kapsulka);
  clrscr;
  sprawdzHaslo(kapsulka);
  clrscr;
  window(15,2,60,10);

  skladnik_biezacy := nil;
  zapiszRekord(skladnik_biezacy, pierwszy_skladnik);
  readkey;
END.

Program ma zapisywać do pliku .dat poszczególne rekordy w porządku listy 2-kierunkowej. Więc potrzebne będzie zapamiętanie adresu elementu poprzedniego i następnego. I tu wyskakuje błąd. Stąd moje pytanie : czy zmienną typu wskaźnikowego można zapisać w pliku elementowym, w celu późniejszego użycia?

dodanie znacznika <code class="pascal"> - fp

1

Stąd moje pytanie : czy zmienną typu wskaźnikowego można zapisać w pliku elementowym, w celu późniejszego użycia?

Adresu zmiennej wskaźnikowej nie możesz zapisać (tzn. możesz, ale po ponownym uruchomieniu programu adresy najprawdopodobniej zmienią się), natomiast wartość, na którą wskazuje dany wskaźnik owszem;

Jeśli już chcesz zapisywać zawartość listy do pliku, to zapisuj właśnie jej zawartość - bez kombinowania z adresami; Podczas odczytu danych z pliku tworzysz nowe węzły listy i do już utworzonych wczytujesz dane z pliku, czyli: imię, nazwisko, numer telefonu i opis; Tylko to - żadnych adresów;

Lepszym wyjściem było by skorzystanie z plików amorficznych, a do odczytu z/zapisu do nich wykorzystanie strumienia, np. TFileStream.

0

Bardzo dziękuję za treściwą odpowiedź. Aż wstyd, ale dopiero teraz zauważyłem, że za pomocą procedury read, próbowałem wczytać do rekordu zawartość zmiennej wskazywanej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1