Turbo Pascal "Baza Danych"

0

Witam
Napisałem program baze danych
mam problem w tym, ze nie chce zapisac do pliku jak i z niego odczytac i wyswietlic, nawet z pamieci.
Proszę o pomoc

program baza;
uses crt;

type
  dane = record
    tekst : string;
    liczba : integer;
  end;

const
  poz : integer = 0;

var
  a, zn : char;
  katalog : array[1..100] of dane;
  F : file of dane;

procedure odczytzpliku;
var
  i : integer;
begin
  assign(F, 'baza.dat');
  reset(F);
  i := 0;
  while not eof(F) do
  begin
    inc(i);
    read(F, katalog[i]);
  end;
  poz := i;
  close(F);
end;

procedure zapisdopliku;
var
  i : integer;
begin
  assign(F, 'baza.dat');
  rewrite(F);
  for i := 1 to poz do
    write(F, katalog[i]);
  close(F);
end;

procedure zapis(r : dane);

begin
  with r do
  begin
    writeln('Podaj imie');
    readln(tekst);
    writeln('Podaj wiek');
    readln(liczba);
  end;
end;

procedure zapisdopam;
begin
  inc(poz);
  writeln('Nowa pozycja nr ', poz);
  zapis(katalog[poz]);
end;

procedure odczyt(r : dane);
begin
  with r do
  begin
    writeln('Imie: ', tekst);
    writeln('Wiek: ', liczba);
  end;
end;

procedure odczytzpam;
var
  i : integer;
begin
  for i := 1 to poz do
  begin
    writeln('Pozycja katalogu nr ', i);
    odczyt(katalog[i]);
  end;
  readln;
end;

procedure menu(var a : char);
begin
  writeln('Co chcesz zrobic? Wpisz:');
  writeln('1 :Dla dodania nowej pozycji');
  writeln('2 :Dla pokazania wszystkich pozycji');
  writeln('3 :Dla zapisania bazy');
  writeln('4 :Dla wczytania bazy');
  writeln('5 :Wyjscie');
  a := readkey;
end;

//-------------------------------------------------

begin
  clrscr;
  repeat
    clrscr;
    menu(a);
    case a of
      '1' :
        begin
          clrscr;
          zapisdopam;
        end;
      '2' :
        begin
          clrscr;
          odczytzpam;
        end;
      '3' :
        begin
          clrscr;
          zapisdopliku;
          writeln('Baza zostala zapisana!');
          delay(1000);
        end;
      '4' :
        begin
          clrscr;
          odczytzpliku;
          writeln('Baza zostala wczytana!');
          delay(1000);
        end;
      '5' :
        begin
          clrscr;
          zapisdopliku;
          writeln('Milego dnia');
          delay(1000);
          halt;
        end;
    else
      writeln('Blad!');
    end;
  until False;
end.
0

Witam
Napisałem program baze danych
mam problem w tym, ze nie chce zapisac do pliku jak i z niego odczytac i wyswietlic, nawet z pamieci.
Proszę o pomoc

A jak brzmi pytanie? Umiesz takie coś zadać?

0

Kod przeformatowałem i wstawiłem w tagi, następnym razem rób to albo temat wyląduje w Koszu. A co do Turbo Pascala, to nie ma co pisać w tak starym kompilatorze, do którego uruchomienia potrzeba przynajmniej DosBOX'a, proponuje się jak najszybciej przesiąść na FPC, a co do problemu to za pewne zapis nie udaje się ponieważ zmienna Poz jest globalna czyli wyzerowana, a Ty nigdzie poza proceudrą odczytu nie ustawiasz jej wartości, o ile dobrze patrze na ten Twój kod. Poza tym uprzedzając odpowiedź @-123oho to używaj Debuggera, to wyłapiesz takie błedy szybciej. A jak używać Debuggera dowiesz się na mnóstwie stron, które z łatwoscią możesz wygooglować. I proszę zawsze pomyśl, pokombinuj sam, bo pytanie na forum powinno być w ostateczności, a temat przenoszę do Newbie, bo "problem" dotyczy banalnych podstaw i w tamtym dziale takowe pytanie zadawaj w przyszłości.

EDIT: a jednak @-123oho siedzi non stop, ja mam przerwy na sen po robocie i jestem na necie rzadziej, i dlatego z tego powodu również rzadziej zaglądam na fora.

0

Problem jest w konflikcie pomiędzy:

  dane = record
    tekst : string;
    liczba : integer;
  end;

a:

  F : file of dane;

string - jest tworem dynamicznym, więc zapis tego bezpośrednio do pliku skazany jest na niepowodzenie.
Rozwiązania:

  1. użyć krótkiego string'a np: string[20]
  2. F:Text; i zapis pole po polu.
0

string - jest tworem dynamicznym, więc zapis tego bezpośrednio do pliku skazany jest na niepowodzenie.

Nie prawda.
W TP string=string[255]; - nie jest dynamiczny
FPC {$H-} string=string[255]=shortstring; - nie jest dynamiczny
FPC {$H+} string=ansistring; - jest dynamiczny, można użyć shortstring.
W Delphi pewnie jest string=ansistring;

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