как прочитать массив из файла

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Need_Help
Сообщения: 3
Зарегистрирован: 15 май 2007, 14:24

15 май 2007, 14:47

Есть TP 7.0.
Имеется файл my.txt, в котором есть массив чисел через пробел:
4 3 10
Не могу этот простейший массив из файла передать на экран ( С обычным текстом проблем нет, но когда в файле массив..?)
Так не получается:

Program OpenFile;

const N =3;
var f:text;
s: array [1..N] of integer;
begin
assign(f,h:\bp\bin\moi pro\my.txt');
read(f,s);
writeln(s);
close(f);
end.
Может кто-нибудь знает как правильно, то подскажите а то пишет ошибку
Cannot read or write.....

:rolleyes: Very Need Help Thank you very mutch
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

15 май 2007, 14:48

for i:=1 to n do read(f,s);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
SergeyS
Сообщения: 193
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

15 май 2007, 15:19

readln(f, s)
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

16 май 2007, 01:39

Хыиуду, +1
надо в цикле читать по-элементно, readln(f, s) прочитает из фала строку до CRLF
Изображение
Lesha
Сообщения: 3
Зарегистрирован: 17 май 2007, 12:16

17 май 2007, 12:24

В файле нет инструкции Reset (f)
Если не берет целый массив, можно по элементам через цикл for.
Need_Help
Сообщения: 3
Зарегистрирован: 15 май 2007, 14:24

17 май 2007, 17:24

спасибо, а как быть , если массивов два?
хотелось бы понять, как можно прочесть два массива из файла.

с одним массивом всё понятно ., при помощи цикла считать поэлементно массив.

но как быть с двумя. непонятно как прочитать первый элемент второго массива
3 5 8 19
2 4 9 16 и чем отделять один массив от другого, т.е как обратиться к первому элементу второго массива.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

18 май 2007, 01:08

Код: Выделить всё

const
  _n=100;
  _m=10;
type
  TOneArray=record
    n:integer;
    a:array[1.._n] of integer;
  end;
  TAllArrays=array[1.._m] of TOneArray;
var
  f:text;
  arr: TAllArrays;
  i,j,k:integer;
begin
  assign(f,'c:\my.txt');
  reset(f);
  i:=0;
  while (not eof(f)) and (i<_m) do begin
    inc(i);
    with arr[i] do begin
      n:=0;
      while not eoln(f) and (n<_n) do begin
        inc(n);
        read(f,a[n]);
      end;
      readln(f);
    end;
  end;
  close(f);


  { PROVERKA }
  writeln (i, ' array(s) was(were) loaded');
  for j:=1 to i do with arr[j] do begin
    writeln ('array ',j);
    for k:=1 to n do write(a[k], ', ');
    writeln;
  end;

  write('Press Enter');readln;
end.
Вот это прочитывает из файла до _m массивов. В каждом массиве допускается до _n элементов.
Need_Help
Сообщения: 3
Зарегистрирован: 15 май 2007, 14:24

18 май 2007, 12:20

У меня программа не на Delphi а на паскале :)
Lesha
Сообщения: 3
Зарегистрирован: 17 май 2007, 12:16

19 май 2007, 13:38

В файле нельзя хранить двумерный массив, если это текстовой файл. как в клали туда элементы, так и доставайте. На пример у вас был массив 3 * 2 . Вы положили по элементам 1 -ю строку, потом 2 -ю и 3 -ю. Так же и доставайте. А сколько было элементов и какая размерность массива надо самому помнить или ставuть текстовые указатели в файле. Лучше вообще использовать типизированный файл:

type
TArr = array [1..10] of Integer;

var
a: array [1..5] of TArr;
f: file of TArr;
...
Rewrite (f);
...

for i := 1 to 10 do begin
a [1] := i; {любое число}
end;

Write (f, a [4]);
Close (f);

...

Reset (f)
Seek (f, 3); {перейти к 3 записи}
Read (a [2]);
Close (f);
end.

Можно прямо двумерные массивы записывать.
Lesha.
Ответить