Wczytywanie liczb z każdego wiersza pliku do tablic

0

Witam
Mam nastepujaco wygladajacy plik:

MIN  -4.533  125.239 24 11 0 121 -34.54
MAX  -121  220 -33.43 3 0 0 234.2 -234
MIN  1 -6 -4.9  6 10 923 0.23
MAX  5 2 -1 0  5 87.23   23.5

W każdej lini jest inna liczba liczb(przyjmijmy ze to temperatury)
Nie wiem jak wczytaą je do tablicy (bez tego MIN/MAX na poczatku), oszukalem sie na googlach ale nigdzie rozwiązania NIE MA. REadln albo read odpada. Program mam zrobic na 2 tablicach jednowymiarowych, podejrzewam ze MIN w jednej, max w 2 potem wypisac. Chodzi mi o to jak zapisac te liczby do tablicy, nie potrzebuje gotowca.
pozdrawiam

dodanie znacznika <code> - fp

0

a dlaczego Read i Readln odpada?

0

Dla czego Read i ReadLn odpadają?

0

W takim razie jak to zrobic readem albo readlnem?

0

Wczytaj sobie do jakiegoś stringa cały wiersz Readln-em, a potem podziel względem białych znaków (spacja, tab) na poszczególne elementy, opuszczając pierwszy.

0

Tak myslalem ze bede musial sie bawic w tablice stringow, ale jak zrobic to dzielenie wg znakow. Wlasnie o to mi sie rozchodzi. Nigdzie tego NIE MA, 0 przykładow..

0

Jeśli chcesz dany wiersz podzielić na łańcuchowe składowe to poszukaj sobie w sieci dowolnego algorytmu typu Explode czy podobnnie nazwanego, skorzystaj z funkcji ExtractStrings (ta wypakowuje do klasy typu TStrings) lub machnij taką albo podobną sam; Możesz pobawić się we wskaźnikowe przeszukiwanie i ekstrahowanie składowych, albo skorzystać z funkcji Pos, PosEx, Copy, Delete i tak dalej;

A wątek przenoszę do Newbie, dlatego że dotyczy podstaw.

1
var ch:char;
var I,K:Integer;
var value:Double;
var tb:array of array of double;
begin
  SetLength(tb,4);
  for I:=0 to Length(Tb)-1 do // tu zastosuj eof(plik)
  begin
    ch:='!';
    while ch<>' ' do Read(ch);
    K:=0;
    while true do
    begin
      {$I-} Read(value); {$I+}
      if IOResult<>0 Then break;
      SetLength(Tb[I],K+1);
      Tb[I][K]:=value;
      Inc(K);
    end;
  end;
  for I:=0 to Length(Tb)-1 do
  begin
    Write(I,':',Length(Tb[I]),': ');
    for K:=0 to Length(Tb[I])-1 do Write(Tb[I][K]:9:3);
    WriteLn;
  end;
end.

http://ideone.com/zQrDHb

0

Proponuję wczytać zawartość pliku do StringList-y. Co drugi string tej listy masz cały wiersz zaczynający się od 'MIN' lub 'MAX' i wszystkie liczby z wiersza.
Do rozdzielenia 'MIN' , 'MAX' i liczb w danym wierszu wykorzystaj funkcję ExtractStrings. Jako pierwszy string (o indeksie 0) ze StringList-y zwróconej przez tą funkcję będzie 'MIN' lub 'MAX', pozostałe to kolejne liczby z wiersza.
Tak więc indeksy stringów obu list będą niejako współrzędnymi poszczególnych liczb, jak w tablicy dwuwymiarowej. Dalej już można robić z tym cuda ;)

0

Ok dzieki za przykłady sprobuje sie tym pobawic, mysle ze jest szansa ze dam rade. Od wskaznikow uciekam z daleka, tj zadanie na zaliczenie oceny 3, raczej nieskompikowane.

0

Możesz jeszcze użyć plików typowanych (rekordowych) - jeśli masz stałą ilość tych liczb. Ja bym po prostu cały plik wczytał do StringList, a potem możesz robić co chcesz ;) Najprościej (co nie znaczy, że najlepiej, a na pewno nie najbardziej wydajnie) każdą linijkę z tego StringList wczytywać do drugiego StringList w taki sposób:

 
sl2.text = stringReplace(sl1[i], ' ', #13#10, [rfReplaceAll]);

To spowoduje, że w sl2 będziesz miał w każdej linijce jeden element pliku, tzn:

MAX
temp1
temp2
temp3

I teraz, wiedząc, że pierwszy wiersz wskazuje Ci na typ pomiaru, wiesz, do jakiej tablicy masz przepisać resztę.
To algorytmicznie jest chyba najprostszy sposób wymagający zaledwie kilku linijek.

Oczywiście nie będzie to zbyt optymalne, ale do takich zastosowań w zupełności się nadaje.

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