| 
| 
 | Вопрос # 4 739/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!подскажите пожалуйста, как сохранить массив(массивы) в файл.
 
|  |   Вопрос задал: 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 (статус: Посетитель), 17 ноября 2010, 07:23 [#2]:извините, забыл сказать, массив числовой и многомерный. |  
|   | min@y™ (статус: Доктор наук), 17 ноября 2010, 08:19 [#3]: Цитата (Ham_ele_on): извините, забыл сказать, массив числовой и многомерный.  Приведи описание типа массива, например:
 
 type
  TMyArray = array[1..100500] of Byte; Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 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 (статус: Посетитель), 18 ноября 2010, 06:43 [#8]:почему то этого ответа я не видел. а как прочитать из файла массив??? а если он не один??? а если вместе с массивом ещё и переменные в файл нужно записать и потом прочитать?
 |  
|   | min@y™ (статус: Доктор наук), 18 ноября 2010, 08:18 [#9]: Цитата (Ham_ele_on): почему то этого ответа я не видел. Он в самом верху, под вопросом.
  
 Цитата (Ham_ele_on): а как прочитать из файла массив??? а если он не один??? а если вместе с массивом ещё и переменные в файл нужно записать и потом прочитать?  Для начала тыкай вот сюда и читай, читай, читай.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 28 ноября 2010, 17:55 [#12]:подскажите пожалуйста, а этот код никак нельзя оптимизировать??? |  
|   | min@y™ (статус: Доктор наук), 28 ноября 2010, 18:32 [#13]:Где код? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 (статус: Посетитель), 29 ноября 2010, 07:44 [#15]:код не видно, или его нельзя оптимизировать?? |  
|   | 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 (статус: Посетитель), 29 ноября 2010, 08:49 [#17]:спасибо. буду попробовать   |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |