Pascal- pliki tekstowe(Proszę o pomoc!)

Mam napisać program, który w zmiennej tekstowej zapisze 10 losowo wylosowanych liczb z zakresu od 1…50, a następnie odczyta z pliku tekstowego te liczby, znajdzie minimum i wyświetli na ekranie. Napisałem taki oto kod, ale wyskakuje mi ‘ERROR 106’. Czy jeśli zapisuje się liczby w notatniku w jednej linii nie powinny być one oddalone od siebie jakoś spacjami? Gdzieś tak czytałem, że aby komputer poprawnie rozpoznał(odczytał z pliku tekstowego) liczbę musi ona być oddalona o 1 spację od kolejnej. Oto kod:

Program GenerujPlikTekstowy;


Uses Crt;


Var

  plik_tekstowy: text;


Procedure Start;


Begin

  clrscr;

  writeln('--------------------------------------------------------------------');

  writeln;

  writeln('PROGRAM GENERUJE 10 LICZB DO PLIKU TEKSTOWEGO Z ZAKRESU OD 1 DO 50 I WYBIERA NAJMNIEJSZA');

End;


Procedure LosujIZapisz(var plik_tekstowy: text);


Var

  i: byte;

  t: array [1..10] of byte;

Begin

  assign(plik_tekstowy, 'plik1.txt');

  rewrite(plik_tekstowy);

  randomize;

  for i:=1 to 10 do

 Begin

  t[i]:=random(50)+1;

  write(plik_tekstowy, t[i]);

 End;

  close(plik_tekstowy);

End;


Function OdczytajIZnajdzMinimum(var plik_tekstowy: text): byte;


Var

  i, min: byte;

  t: array [1..10] of byte;


Begin

  assign(plik_tekstowy, 'plik1.txt');

  reset(plik_tekstowy);

  i:=1;

  Repeat

   read(plik_tekstowy, t[i]);

   inc(i);

  Until EOF(plik_tekstowy);

  min:=t[1];

  for i:=2 to 10 do

  if t[i] < min then min:=t[i];

  OdczytajIZnajdzMinimum:=min;

  close(plik_tekstowy);

End;


Begin

  Start;

  writeln;

  LosujIZapisz(plik_tekstowy);

  writeln;

  writeln('Minimum z losowo wygenerowanego zbioru wynosi: ',OdczytajIZnajdzMinimum(plik_tekstowy));

  writeln;

  write('Nacisnij dowolny klawisz aby zakonczyc prace programu...');

  readkey;

End.

W miejscu gdzie operujesz na pliku zmień procedury read() i write() na readln() i writeln().

Jeżeli chcesz dowiedzieć się w jaki sposób pascal tłumaczy zmienne tekstowe na typy numeryczne poczytaj opis procedury val() i ew. pobaw się nią trochę.

Dzięki wielkie dzięki działa wszystko, tylko jak zrobić, aby liczby nie zostały zapisywane w pliku tekstowym w 1 kolumnie lecz 1 rzędzie?

Do zapisu użyj polecenia:

Write(plik, zmiena_liczbowa, ' ')

W ten sposób powstanie rząd liczb oddzielonych spacjami. Standardowo oddziela się także liczby używając przecinka, średnika lub znaku tabulacji (jak chcesz poczytać szerzej: poszukaj coś w necie na temat formatu plików tekstowych csv/dat/txt - lub przejrzyj opcje importu arkuszy kalkulacyjnych - tam też coś się dowiesz).

Procedura odczytu taka jaką wysłałeś - z tego co sprawdzałem ze spacją jako znakiem rozdzielającym działa, ze średnikiem wyrzuca RE 106 (trzeba by się zapewne bawić w “ręczny” import).

Edit: Do zapisu możesz też użyć swojej procedury, tylko wymusić zapis w konkretnej (o 1 większej niż liczby) ilości znaków dziesiętnych (tu: 3) - różnica jest taka, że w tym przypadku spację nadmiarową będziesz miał na początku, a nie końcu pliku.

Zrobiłem tak jak kazaliście. Liczby zapisują się w jednej linii z odstępami. Tylko, że teraz nie działa mi algorytm znajdowania minimum. Nie wiem czemu ale wygląda to tak jakby wybierał 1 lepsza z przodu i brał ją za min.

Program GenerujPlikTekstowy;


Uses Crt;


Var

 plik_tekstowy: text;


Procedure Start;


Begin

 clrscr;

 writeln('--------------------------------------------------------------------');

 writeln;

 writeln('PROGRAM GENERUJE 10 LICZB W TXT Z ZAKRESU OD 1 DO 50 I WYBIERA NAJMNIEJSZA');

End;


Procedure LosujIZapisz(var plik_tekstowy: text);


Var

 i: byte;

 t: array [1..10] of byte;

Begin

 assign(plik_tekstowy, 'C:\plik1.txt');

 rewrite(plik_tekstowy);

 randomize;

 for i:=1 to 10 do

 Begin

  t[i]:=random(50)+1;

  write(plik_tekstowy, t[i], ' ');

 End;

 writeln;

 write('Liczby zapisane do pliku txt: ');

 for i:=1 to 10 do

 write(t[i],', ');

 close(plik_tekstowy);

End;


Function OdczytajIZnajdzMinimum(var plik_tekstowy: text): byte;


Var

 i, min: byte;

 c: string;

 t: array [1..10] of byte;


Begin

 assign(plik_tekstowy, 'C:\plik1.txt');

 reset(plik_tekstowy);

 i:=1;

 Repeat

  read(plik_tekstowy, t[i], c);

  inc(i);

 Until EOF(plik_tekstowy);

 min:=t[1];

 for i:=2 to 10 do

 if t[i] < min then min:=t[i];

 OdczytajIZnajdzMinimum:=min;

 close(plik_tekstowy);

End;


Begin

 Start;

 LosujIZapisz(plik_tekstowy);

 writeln;

 writeln;

 writeln('Minimum z losowo wygenerowanego zbioru wynosi: ',OdczytajIZnajdzMinimum(plik_tekstowy));

 writeln;

 write('Nacisnij dowolny klawisz aby zakonczyc prace programu...');

 readkey;

End.

Zamiast:

read(plik_tekstowy, t_, c);_

daj:

read(plik_tekstowy, t_);_

Zrobiłem tak ale wywala exitcode 201. Prawdopodobnei dlatego, że puste miejsce(’ ') jest innego typu(string) i nie ma swojej zmiennej do zapisania.

Z jakiego kompilatora korzystasz? U mnie ze zmianą podana przez [alex] działa poprawnie (freepascal).

A nie powinno, bo trzeba jeszcze:

write(plik_tekstowy, t_, ’ ');_

zamienić na:

write(plik_tekstowy, ’ ', t_);_