Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 739

/ вопрос открыт /

Приветствую, уважаемые эксперты!
подскажите пожалуйста, как сохранить массив(массивы) в файл.

Ham_ele_on Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ham_ele_on (статус: Посетитель)
Вопрос отправлен: 16 ноября 2010, 21:14
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Ну, как один из вариантов:

var
  Ar: array[0..3,0..4,0..3] of integer; 
  fs: TFileStream;
begin
  // <--- здесь какая-либо инициализация массива
 
  fs:= TFileStream.Create(Путь_и_Имя_файла.Расширение, fmOpenWrite or fmShareExclusive);
  try
    fs.Write(Ar, SizeOf(Ar));
  finally
    fs.Free();
  end;
end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 ноября 2010, 13:31
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 17; последнее сообщение — 29 ноября 2010, 08:49; участников в обсуждении: 3.

16 ноября 2010, 21:28: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с файловой системой модератором Ерёмин А.А.

Жикльор

Жикльор (статус: 5-ый класс), 16 ноября 2010, 21:44 [#1]:

Самый простой способ:
var
  f: TextFile;
  i: integer;
  mas: array [1..10] of integer;
begin
  AssignFile(f,'file.txt');
  Rewrite(f);
  for i:=1 to 10 do
    begin
    mas[i]:=Random(20);
    Write(f,mas[i]);
    end;
  CloseFile(f);
end;
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Ham_ele_on

Ham_ele_on (статус: Посетитель), 17 ноября 2010, 07:23 [#2]:

извините, забыл сказать, массив числовой и многомерный.
min@y™

min@y™ (статус: Доктор наук), 17 ноября 2010, 08:19 [#3]:

Цитата (Ham_ele_on):

извините, забыл сказать, массив числовой и многомерный.

Приведи описание типа массива, например:
type
  TMyArray = array[1..100500] of Byte;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 17 ноября 2010, 13:14 [#4]:

var
Ar:array [0..3,0..4,0..3]of integer;
Жикльор

Жикльор (статус: 5-ый класс), 17 ноября 2010, 18:47 [#5]:

Ну так а в чем проблема, по тому же принципу.
var
i,j,k: integer;
A: array [1..4,1..5,1..4] of integer;
begin
for i:=1 to 4 do
  begin
  for j:=1 to 5 do
    begin
    for k:=1 to 4 do
      begin
      write(f,A[i][j][k]);
      end;
    writeln(f,#13);
  end;  
  writeln(f,#13);
  end;
end;
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Ham_ele_on

Ham_ele_on (статус: Посетитель), 17 ноября 2010, 18:56 [#6]:

а можно теперь словами объяснить?
Жикльор

Жикльор (статус: 5-ый класс), 17 ноября 2010, 23:52 [#7]:

Мне вариант min@y™ даже больше понравился. Объясняю что он делает:
var
  Ar: array[0..3,0..4,0..3] of integer; //объявляем массив
  fs: TFileStream; // объявляем файловый поток
begin
  // <--- здесь какая-либо инициализация массива
  fs:= TFileStream.Create(Путь_и_Имя_файла.Расширение, fmOpenWrite or fmShareExclusive); //создаешь файловый поток и
связываешь его с твоим файлом
  try
    fs.Write(Ar, SizeOf(Ar)); //пробуешь записать в поток массив Ar и размер записываемого равен размеру массива
  finally
    fs.Free(); //освобождаем файловый поток
  end;
end;
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Ham_ele_on

Ham_ele_on (статус: Посетитель), 18 ноября 2010, 06:43 [#8]:

почему то этого ответа я не видел.
а как прочитать из файла массив??? а если он не один??? а если вместе с массивом ещё и переменные в файл нужно записать и потом прочитать?
min@y™

min@y™ (статус: Доктор наук), 18 ноября 2010, 08:18 [#9]:

Цитата (Ham_ele_on):

почему то этого ответа я не видел.

Он в самом верху, под вопросом. :)

Цитата (Ham_ele_on):

а как прочитать из файла массив??? а если он не один??? а если вместе с массивом ещё и переменные в файл нужно записать и потом прочитать?

Для начала тыкай вот сюда и читай, читай, читай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 18 ноября 2010, 08:29 [#10]:

спасибо за ссылки, я именно этим путём и пошёл, но через яндекс.:-)
P\S.чем больше узнаю, тем интереснее становится.:-)
Ham_ele_on

Ham_ele_on (статус: Посетитель), 19 ноября 2010, 06:57 [#11]:

получилось вот так(тестовый код):
procedure TForm1.LoadClick(Sender: TObject);
 
var Ar,Ar1:array[1..3,1..4] of integer;
 SumAr:array [1..4] of integer;
Fs:TFileStream ;
begin
Fs:=TFileStream.Create('Test.mr',fmOpenRead);
try
  Fs.Read(Ar,SizeOf(Ar));
  Fs.Read(Ar1,SizeOf(Ar1));
 
  L1.Caption:=IntToStr(Ar[1,1]);
  L2.Caption:=IntToStr(Ar[1,2]);
  L3.Caption:=IntToStr(Ar[1,3]);
  L4.Caption:=IntToStr(Ar[2,1]);
 L5.Caption:=IntToStr(Ar[2,2]);
  L6.Caption:=IntToStr(Ar[2,3]);
  L12.Caption:=IntToStr(Ar1[1,1]);
  L22.Caption:=IntToStr(Ar1[1,2]);
  L32.Caption:=IntToStr(Ar1[1,3]);
  L42.Caption:=IntToStr(Ar1[2,1]);
 L52.Caption:=IntToStr(Ar1[2,2]);
  L62.Caption:=IntToStr(Ar1[2,3]);
  Fs.Read(SumAr,SizeOf(SumAr));
  Label1.Caption:=IntToStr(SumAr[1]);
  Label2.Caption:=IntToStr(SumAr[2]);
  Label3.Caption:=IntToStr(SumAr[3]);
  Label4.Caption:=IntToStr(SumAr[4]);
finally
  Fs.Free();
 
end;
end;
 
procedure TForm1.saveClick(Sender: TObject);
var Ar,Ar1:array[1..3,1..4] of integer;
SumAr:array [1..4] of integer;
Fs:TFileStream ;
begin
Ar[1,1]:=StrToInt(E1.Text);
Ar[1,2]:=StrToInt(E2.Text);
Ar[1,3]:=StrToInt(E3.Text);
Ar[2,1]:=StrToInt(E4.Text);
Ar[2,2]:=StrToInt(E5.Text);
Ar[2,3]:=StrToInt(E6.Text);
Ar1[1,1]:=StrToInt(E12.Text);
Ar1[1,2]:=StrToInt(E22.Text);
Ar1[1,3]:=StrToInt(E32.Text);
Ar1[2,1]:=StrToInt(E42.Text);
Ar1[2,2]:=StrToInt(E52.Text);
Ar1[2,3]:=StrToInt(E62.Text);
SumAr[1]:=11; SumAr[2]:=22;
SumAr[3]:=33; SumAr[4]:=44;
Fs:=TFileStream.Create('Test.mr',fmOpenWrite);
try
  Fs.Write(Ar,SizeOf(Ar));
  Fs.Write(Ar1,SizeOf(Ar1));
  Fs.Write(SumAr,SizeOf(SumAr));
finally
  Fs.Free();
end;
end;
почему то не получилось использовать Wiht..do,
и если я пробовал суммировать значения массивов и записывать их в третий массив
SumAr[1]:=Ar1[2,3]+Ar[1,3];
то данные записываются не туда куда нужно.
Ham_ele_on

Ham_ele_on (статус: Посетитель), 28 ноября 2010, 17:55 [#12]:

подскажите пожалуйста, а этот код никак нельзя оптимизировать???
min@y™

min@y™ (статус: Доктор наук), 28 ноября 2010, 18:32 [#13]:

Где код?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 28 ноября 2010, 20:41 [#14]:

procedure TForm1.LoadClick(Sender: TObject);
 
var Ar,Ar1:array[1..3,1..4] of integer;
 SumAr:array [1..4] of integer;
Fs:TFileStream ;
begin
Fs:=TFileStream.Create('Test.mr',fmOpenRead);
try
  Fs.Read(Ar,SizeOf(Ar));
  Fs.Read(Ar1,SizeOf(Ar1));
 
  L1.Caption:=IntToStr(Ar[1,1]);
  L2.Caption:=IntToStr(Ar[1,2]);
  L3.Caption:=IntToStr(Ar[1,3]);
  L4.Caption:=IntToStr(Ar[2,1]);
 L5.Caption:=IntToStr(Ar[2,2]);
  L6.Caption:=IntToStr(Ar[2,3]);
  L12.Caption:=IntToStr(Ar1[1,1]);
  L22.Caption:=IntToStr(Ar1[1,2]);
  L32.Caption:=IntToStr(Ar1[1,3]);
  L42.Caption:=IntToStr(Ar1[2,1]);
 L52.Caption:=IntToStr(Ar1[2,2]);
  L62.Caption:=IntToStr(Ar1[2,3]);
  Fs.Read(SumAr,SizeOf(SumAr));
  Label1.Caption:=IntToStr(SumAr[1]);
  Label2.Caption:=IntToStr(SumAr[2]);
  Label3.Caption:=IntToStr(SumAr[3]);
  Label4.Caption:=IntToStr(SumAr[4]);
finally
  Fs.Free();
 
end;
end;
 
procedure TForm1.saveClick(Sender: TObject);
var Ar,Ar1:array[1..3,1..4] of integer;
SumAr:array [1..4] of integer;
Fs:TFileStream ;
begin
Ar[1,1]:=StrToInt(E1.Text);
Ar[1,2]:=StrToInt(E2.Text);
Ar[1,3]:=StrToInt(E3.Text);
Ar[2,1]:=StrToInt(E4.Text);
Ar[2,2]:=StrToInt(E5.Text);
Ar[2,3]:=StrToInt(E6.Text);
Ar1[1,1]:=StrToInt(E12.Text);
Ar1[1,2]:=StrToInt(E22.Text);
Ar1[1,3]:=StrToInt(E32.Text);
Ar1[2,1]:=StrToInt(E42.Text);
Ar1[2,2]:=StrToInt(E52.Text);
Ar1[2,3]:=StrToInt(E62.Text);
SumAr[1]:=11; SumAr[2]:=22;
SumAr[3]:=33; SumAr[4]:=44;
Fs:=TFileStream.Create('Test.mr',fmOpenWrite);
try
  Fs.Write(Ar,SizeOf(Ar));
  Fs.Write(Ar1,SizeOf(Ar1));
  Fs.Write(SumAr,SizeOf(SumAr));
finally
  Fs.Free();
end;
end;
Ham_ele_on

Ham_ele_on (статус: Посетитель), 29 ноября 2010, 07:44 [#15]:

код не видно, или его нельзя оптимизировать??
min@y™

min@y™ (статус: Доктор наук), 29 ноября 2010, 08:17 [#16]:

Цитата (Ham_ele_on):

код не видно, или его нельзя оптимизировать??

Код можно оптимизировать так:
1. Выкинуть полностью обработчики LoadClick() и SaveClick();
2. Поставить пакет RxLib 2.75.
3. Положить на форму компонент TFormStorage из этого пакета и грамотно его настроить.
Вот и вся оптимизация.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ham_ele_on

Ham_ele_on (статус: Посетитель), 29 ноября 2010, 08:49 [#17]:

спасибо. буду попробовать:-)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:32
Выполнено за 0.04 сек.