Zapis i odczyt z pliku - problem

0

Witam,
otoz w programie ktory pisze operuje na punktach majacych wspolrzedne. Czesc programu odpowiada za ich zapis do pliku i odczycie, ale w takim formacie, zeby recznie rowniez mozna bylo pzrygotowac plik, dajacy sie wczytac. Przyjalem taki sposob, ze kazda linia pliku textowego zawiera pare licz: wspolrzedne x i y.
punkty sa przechowywane w tabeli boolean.
Plik wyglada np tak:

12 3
2 45
2 34
12 11

napisalem taki kod:

Zapis:

 
begin
memo1.lines.Clear;
  for i:=1 to wymiar do
    for j:=1 to wymiar do
      if tab[i,j]=true then
        begin
          d:=(inttostr(i))+' '+(inttostr(j));
          memo1.lines.add(d);
        end;
  if savedialog1.execute then
    begin
      assignfile(outfile, Savedialog1.FileName);
      rewrite(outfile);
      writeln(outfile, memo1.text);
      closefile(outfile);
    end;
end;

i wczytywanie:

 begin
        assignfile(infile,opendialog1.filename);
        reset(infile);
        while not EOF(infile) do
          begin
            readln(infile,data);
                i:=0;
                ipos:=i;
                repeat
                  inc(ipos);
                until data[ipos+1]=' ';
                a:=copy(data,i,ipos);
                i:=ipos+2;
                ipos:=ipos+1;
                repeat
                  inc(ipos);
                until data[ipos+1]='';
                b:=copy(data,i,ipos);
                y:=strtoint(a)-1; 
                x:=strtoint(b)-1;
                tab[x,y]:=true;

          end;

Osobne procedury wydaja sie dzialac poprawnie, zapisany plik wyglada jak ma wygladac, a plik przygotowany recznie jest poprawnie wczytywany.

Problem pojawia sie, gdy wczytuje plik, ktory wczesniej stworzylem zapisujac ta procedura.
Problem moze lezec w nepoprawnym rozpoznawaniu konca linii..

P.S. Sorry za rozlegly i nieczytelny kod...

Jesli łatwiej komus napisac wlasny kod, bylbym wdzieczny...

0

Wczytując zamykasz plik?

0

tak, nawet pliki ktore wczesniej zapsialem nie chca sie otworzyc, przy probie otwarcia pokazuje sie blad wskazujacy na linie:

until data[ipos+1]=' ';

0

Dzieje się tak gdy w wczytywanym pliku znjdują sie na końcu 2 "Entery" #13#10.
Aby uniknąć tego błędu dopisz:

        assignfile(infile,opendialog1.filename);
        reset(infile);
        while not EOF(infile) do
          begin
            readln(infile,data);
            if data = '' then continue;        //<====
{...}

I poczytaj o funkcji Pos [browar] .

0

Jeżeli chcesz to przeanalizuj moją propozycję.

type
 // rekord na przechowanie współrzędnych
 TWpolrzedne = record
  x, y :single; // typ dowolny
 end;

const
 MAX_INDEX = 100; // maksymalna ilość elementów

var
 // tablica współrzędnych
 Wpolrzedne :array[1..MAX_INDEX] of TWspolrzedne;
 // wspórzędne dla Explode()
 x, y       :string;

procedure Explode(const s :string; var sx, sy :string);
var SemiPos :Byte;
begin
 SemiPos := Pos(';', s);  // oblicza pozycję dzielnika tekstu

 sx := Copy(s, 1, SemiPos-1); // wszystko do średnika
 sy := Copy(s, SemiPos+1, Length(s)-SemiPos); // wszystko za średnikiem
end;

procedure SaveToFile(const FileName :string);
var
 F :TextFile;
 i :Byte;
begin
 AssignFile(FileName);
 Rewrite(F);
 // zapis całej tablicy do pliku
 for i := 1 to MAX_INDEX do WriteLn(F, x, ';', y);
 CloseFile(F);
end;

procedure LoadFromFile(const Filename :string);
var s :string;
begin
 AssignFile(FileName);
 Reset(F);
 while not Eof(F) do
  begin
   ReadLn(F, s);     // odczyt wiersza
   Explode(s, x, y); // rozbicie na dwie zmienne
  end;
 CloseFile(F);
end;
0

ok, dzieki wielkie, to byl ten blad ;-)
przy okazji zauwazylem ,ze mimow szystko musze cos zmienic, bo dane z planszy 100x100 zajmuja 10000 miejsc, i moje rozwiazanie obciaza kompa...

0

Oleksy_Adam, dzieki, skorzystalem z twojej propozycji i udoskonalilem swoj algorytm (to uzycie memo u mnie bylo bez sensu)

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