Wczytywanie danych z pliku do tablicy

0

Witam, mam problem. Mam taki kod, ale on nie chce działać - program kompiluje się poprawnie (środowisko: Lazarus), jednak przy wczytywaniu danych z pliku program wywala.

Zawartość pliku macierz1.txt:

1 3 4
5 6 5
6 7 5

Kod programu:

program macierze;
var k, l, n: integer;
  macierz1: array of array of integer;
  Mac1txt: TextFile;
begin
  Writeln('Wpisz ilosc wierszy lub kolumn macierzy, na ktorych bedziemy przeprowadzac operacje:');
  readln(n);  { TO DO: DODAJ WIDELKI 1<n<=20 }
  SetLength(macierz1, n, n);
  Writeln('Teraz zostanie wczytany plik macierz1.txt z pierwsza macierza.');
  Writeln('Utworz plik tekstowy z danymi w folderze programu i nacisnij Enter, aby kontynuowac.');
  readln;
  Assignfile(Mac1txt, 'macierz1.txt');
  Reset(Mac1txt);
  for l:=1 to n do
    begin
    for k:=1 to n do
      begin
      Read(Mac1txt, macierz1[k,l]); {przy tej linii wywala (RunCode(2))}
      end;
    end;
  Closefile(Mac1txt);
  Writeln('Oto wczytana macierz:');
  Write(macierz1[k,l]:5);
  readln;
end.

Chcę wczytać macierz z pliku i ją wyświetlić. Męczę się z tym dłuższy czas i nie wiem co tu jest nie tak.
Z góry dzięki za odpowiedź.

1
var k, l, n: integer;
  macierz1: array of array of integer;
  Mac1txt: TextFile;
begin
  Writeln('Wpisz ilosc wierszy lub kolumn macierzy, na ktorych bedziemy przeprowadzac operacje:');
  readln(n);  { TO DO: DODAJ WIDELKI 1<n<=20 }
  SetLength(macierz1, n, n);
  Writeln('Teraz zostanie wczytany plik macierz1.txt z pierwsza macierza.');
  Writeln('Utworz plik tekstowy z danymi w folderze programu i nacisnij Enter, aby kontynuowac.');
  readln;
  Assignfile(Mac1txt, 'macierz1.txt');
  Reset(Mac1txt);
  for l:=0 to n-1 do
    begin
    for k:=0 to n-1 do
      begin
      Read(Mac1txt, macierz1[k,l]); {przy tej linii wywala (RunCode(2))}
      end;
    end;
  Closefile(Mac1txt);
  Writeln('Oto wczytana macierz:');
  for l:=0 to n-1 do
    begin
    for k:=0 to n-1 do Write(macierz1[k,l]:5);
    WriteLn;
    end;
  readln;
end.
0

Dzięki za odpowiedź. Niestety, to nic nie zmieniło - nadal Error RunCode(2).

0

Skoro nadal nie wiesz co jest błedem to podpowiem - sprawdź indeksację pętlach wczytujących.

0

Rozumiem, że w pętlach mam zaczynać od 0, a nie od 1 (o to chodziło, Furious Programming?), choć muszę przyznać, że w pętli for od 1 zawsze wszystko mi działało. Rzecz w tym, _13th_Dragon, że przekleiłem Twój kod zastępując mój i nadal ten błąd występuje... RunError(106) lub RunCode(2) - różnie.

0

http://lmgtfy.com/?q=run+error+106+pascal

http://community.freepascal.org/docs-html/user/userch14.html

Runtime Error 106 Invalid numeric format
Reported when a non-numeric value is read from a text le, when
a numeric value was expected.

var
  macierz1 : array of array of INTEGER
  mac1txt : TEXTFILE

Read(mac1txt, macierz1[k,l]); // <- błąd w tej linijce

http://lmgtfy.com/?q=zamiana+string+na+integer+pascal

Konwersja liczb na string i vice versa

Rozwiazanie:

var
 tmp : string;


  Read(mac1txt, tmp);
  macierz1[k,l] := StrToInt(tmp);

Google Nie boli ;)

0
wjertlo napisał(a)

choć muszę przyznać, że w pętli for od 1 zawsze wszystko mi działało.

Być może, ale na pewno nie przy macierzach dynamicznych, które zawsze są indeksowane od 0;

A jeśli masz wątpliwości lub chcesz mieć kod uwzględniający zmiany wielkości macierzy, możesz skorzystać z funkcji Low oraz High, które zwracają odpowiednio indeks pierwszego i ostatniego elementu tablicy; Przy tablicach dynamicznych może to mylić, ale jeśli prosta jednowymiarowa tablica zawiera np. 5 elementów, to:

Funkcja Rezultat Opis
Low 0 indeks pierwszego elementu (w tablicach dynamicznych zawsze 0
High 4 indeks ostatniego elementu
Length 5 ilość wszystkich elementów bez względu na indeksację
Tego trzeba się nauczyć i zawsze o tym pamiętać, a problemów więcej nie będzie; Dobrym zwyczajem jest indeksacja od 0 nawet macierzy statycznych - dzięki temu nigdy więcej nie powinno się to mylić.
0

Dziękuję bardzo za odpowiedzi. Babubabu, Twój kod (zaktualizowany dziś) nie działa, ponieważ wywala błąd EConvertError: Invalid integer (próbuje brać całą zawartość pliku jako jeden integer, a nie oddziela liczb). Mógłby ktoś mnie naprowadzić na rozwiązanie? Z góry dziękuję.

0

Masz już podane: gotowe, działające i sprawdzone rozwiązanie.

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