Pobieranie danych z pliku.

0

Witam, tak jak w temacie, mój problem polega na wczytywaniu plików.
Otóż mam dane w takiej formie:

1779 -4,9 2,2 3,8 9,5 15,4 16,4 17,9 19,5 14,7 9,3 4,1 1,4
1780 -5,1 -4,3 4,4 5,9 14,2 17,2 19,4 17,9 13,1 9,4 2,8 -4,6
1781 -4,0 -1,9 1,5 9,1 13,8 19,2 20,1 22,8 16,2 6,0 4,0 -3,6

I piknię mi wszystko działa tylko bez jednej rzeczy, ostatniej danej. Dlaczego? Co mam źle? Następny wiersz jest oczywiście nowymi osobnymi danymi.

program wczytywanieplikow;
uses crt;

Var
 plik1:text;              //wskazanie na plik
 plik2:text;
 linia:string;              //pobieranie calego wierszu z pliku do programu
 dane:array[1..1000] of string; //przechowywanie tego co mamy wywalic w
                               //zapisywaniu
 x:integer;             //licznik w petli
 i:integer;            // licznik w petli
 y:integer;            //dlugosc w liczbie ciagu znakowego
 poczatek:integer;    //DO wyciagania z stringu potrzebnych danych
 koniec:integer;      //poczatek i koniec potrzebnego strigu
 sredniatemperatura:real;  //srednia temperatura
 temperatura:real;  // przechowuje aktualana temperature
 czyrok:integer; //Czy wczytujemy rok czy temperature
 temp:string;  //zamienia temperature z stringa na liczbe
 temp1:integer;  //temperatura jako string
 rok:string;   // przechowuje informacje o danym roku z wierszu
 temp3:integer;  //czy poprawnie zamienil, wymagane przez
                //funkcje, w programie nie wykorzystany
 stringsrtemp:string; // przechowuje srednia temperatur jako string

Begin
 assign(plik1, 'C:\zadanie\temp.txt');
 reset(plik1);
 poczatek:=0; y:=0;
 ClrScr;
 dane[1]:='';
 repeat
  readln(plik1,linia);
  y:=length(linia);
  for x:=1 to y do
  begin
   if(linia[x]=',') then linia[x]:='.';
  end;
  i:=1;
  poczatek:=1;
  while(y>i) do
  begin
   if(linia[i]=' ') then
   begin
    koniec:=i;
    if(czyrok=0) then
    begin
     writeln(koniec-poczatek);
     rok:=copy(linia,poczatek,koniec-poczatek);
     writeln(rok);
     czyrok:=1;
    end
    else
    begin
     temp:=copy(linia,poczatek,koniec-poczatek);
     val(temp,temperatura,temp3);
     write(temperatura:5:2); write(' ');
     sredniatemperatura:=sredniatemperatura+temperatura;
    end;
    poczatek:=koniec;
    write ('Y: ');  writeln(y);
    write('Poczatek: ');  writeln(poczatek);
    write('Koniec: '); writeln(koniec);
    readln;
   end;
   if(czyrok=1) then
   begin
    sredniatemperatura:=sredniatemperatura/12;
    str(sredniatemperatura:4:2,stringsrtemp);
    dane[x+1]:=rok+' '+stringsrtemp;
    sredniatemperatura:=0;
    czyrok:=0;
   end;
   i:=i+1;
  end;
 UNTIL EOF(plik1);
 close(plik1);
 assign(plik2, 'C:\zadanie\zadanie.txt');
 rewrite(plik2);
 x:=1;
 while(not(dane[x]='')) do
 begin
  writeln(plik2,dane[x]);
  writeln(dane[x]);
  x:=x+1;
 end;
 close(plik2);
 readln;
End.
0

Na początek w ogóle polecałbym porozdzielać ten kod na pomniejsze procedury robiące pojedyncze rzeczy, bo w ten sposób ten kod jest strasznie nieczytelny.

0

Nie wiem czy procedury są, aż takie ważne.
Program ma za zadanie:

  • otworzyć plik,
  • pobrać pierwszy wers do zmiennej,
  • zamienić , na .
  • jeśli pierwszy raz jest wywoływany to ma pobrać czteroelementowy rok.
  • jeśli nie, to ma pobrać liczbę oddzieloną od reszty spacją
    Dwa ostatnie punkty muszą być w pętli ponieważ ma zliczać każdą liczbę, od -4.9 do 1,4
    Jak zakończy wers ma zliczyć średnią i ma zapisać w tabeli w formie rok średnia.
    Przywrócić domyślne wartości, aby móc wykonać pętlę jeszcze raz.
    Prawdopodobnie mam problem z pętlą While ponieważ się za szybko kończy.
0

Nie wiem czy procedury są, aż takie ważne.

Są na tyle ważne, że zwiększają czytelność kodu i łatwość modyfikowania poszczególnych elementów algorytmu; Dobrą praktyką jest tworzenie osobnych procedur/funkcji dla poszczególnych operacji;

  • pobrać pierwszy wers do zmiennej,
  • zamienić , na .

Więc wczytujesz wers z pliku do zmiennej łańcuchowej typu np.: String, następnie zamieniasz wszystkie przecinki na kropki funkcją StringReplace;

  • jeśli pierwszy raz jest wywoływany to ma pobrać czteroelementowy rok.
  • jeśli nie, to ma pobrać liczbę oddzieloną od reszty spacją

Do rozdzielenia łańcucha według specjalnych znaków służy funkcja ExtractStrings - dzielisz łańcuch na mniejsze sekcje i wybierasz odpowiednie dla danych czynności;

0

Ale to jest Free Pascal, nie Delphi. Chętnie bym użył takich funkcji tylko one nie działają w Free Pascalu.

0
luke18dg napisał(a):

Ale to jest Free Pascal, nie Delphi. Chętnie bym użył takich funkcji tylko one nie działają w Free Pascalu.

Bzdura.
Dołącz odpowiednie nagłówki (moduły), a będzie działać.
Ew.pobierz Lazarusa (środowisko do Pascal oparte o FPC).

0

A jeśli można prosić podanie odpowiedniego modułu ponieważ jestem zielony w tym i nie widzę zbytnio na tych stronach jaki modułów mam dołączyć.
I niestety muszę pracować na czysty FPC.

0

Moduł Classes - jest to napisane przecież tutaj: ExtractStrings

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