Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2017, 09:55   #1
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Вопрос delphi как сохранить в файл, а потом загрузить из него инфу

Код:
 
Type
 TArrayOfreal  =  Array of real;
  //  >>> W >>> input >>> output
Type
 TNeuron = Record
  X: TArrayOfreal;  // вход
  W: TArrayOfreal;  // входные веса
  Y: real;        // ответ нейрона
  Err: real;
 end;
Type
  TX = Array of TNeuron;
  TYxX= Array of TX;

 var
  Sloy: TYxX;
пробовал так:
Код:
procedure TForm1.btn4Click(Sender: TObject); // сохранить сеть
var   fs: TFileStream; DT: string;
i,j,k:Integer;
begin
//                         'Memo\I'+IntToStr(Length(Sloy))+' '+DateTimeToStr(DT)+'.network'
fs:= TFileStream.Create('Memo\test.network', fmCreate);
  for i := 0 to High(Sloy) do begin  // слои
    fs.Write(Sloy, SizeOf(TYxX));
    for j := 0 to High(Sloy[i]) do begin  // нейроны
      fs.Write(Sloy[i][j], SizeOf(TYxX));
      for k := 0 to High(Sloy[i][j].W) do begin   // веса
        fs.Write(Sloy[i][j].W[k], SizeOf(TYxX));

      end;
    end;
  end;
  fs.Free;
end;
procedure TForm1.btn5Click(Sender: TObject); // загр. сеть
var   fs: TFileStream;
i,j,k:Integer;
begin
fs:= TFileStream.Create('Memo\test.network', fmCreate);
  for i := 0 to High(Sloy) do begin  // слои
    fs.Read(Sloy, SizeOf(TYxX));
    for j := 0 to High(Sloy[i]) do begin  // нейроны
      fs.Read(Sloy[i][j], SizeOf(TYxX));
      for k := 0 to High(Sloy[i][j].W) do begin   // веса
        fs.Read(Sloy[i][j].W[k], SizeOf(TYxX));

      end;
    end;
  end;
  fs.Free;
end;
все происходит без всяких ошибок, но толку от этого нет, то есть не загружается инфа обратно

Последний раз редактировалось Михаил22042016; 22.01.2017 в 09:57.
Михаил22042016 вне форума Ответить с цитированием
Старый 22.01.2017, 11:05   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Было бы странно, если бы читалось.
Попробуйте для чтения
Код:
fs:= TFileStream.Create('Memo\test.network', fmOpenRead);
fmCreate для создания нового файла или для записи в уже существующий.
digitalis вне форума Ответить с цитированием
Старый 22.01.2017, 11:15   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Динамические массивы так не пишут.
Код:
type TArrayOfreal = array of Real;
     TNeuron = Record
       X: TArrayOfreal;  // вход
       W: TArrayOfreal;  // входные веса
       Y: real;        // ответ нейрона
       Err: real;
     end;
     TX = Array of TNeuron;
     TYxX = Array of TX;

procedure ShowTYxX(m: TYxX; Memo: TMemo);
var i,j,k: Integer;
    s: String;
begin
  Memo.Clear;
  Memo.Lines.Add(Format('Length(m)=%d',[Length(m)]));
  Memo.Lines.Add('');
  for i:=Low(m) to High(m) do begin
    Memo.Lines.Add(Format('Length(m[%d]) = %d',[i,Length(m[i])]));
    Memo.Lines.Add('');
    for j:=Low(m[i]) to High(m[i]) do begin
      s:=Format('Length(m[%d][%d].X) = %d, значения = ',[i,j,Length(m[i][j].X)]);
      for k:=Low(m[i][j].X) to High(m[i][j].X) do s:=s+Format('%f; ',[m[i][j].X[k]]);
      Memo.Lines.Add(s);
      s:=Format('Length(m[%d][%d].W) = %d, значения = ',[i,j,Length(m[i][j].W)]);
      for k:=Low(m[i][j].W) to High(m[i][j].W) do s:=s+Format('%f; ',[m[i][j].W[k]]);
      Memo.Lines.Add(s);
      Memo.Lines.Add(Format('m[%d][%d].Y = %f',[i,j,m[i][j].Y]));
      Memo.Lines.Add(Format('m[%d][%d].Err = %f',[i,j,m[i][j].Err]));
      Memo.Lines.Add('');
    end;
  end;
end;

procedure SaveToStreamTYxX(m: TYxX; Stream: TStream);
var Len,i,j: Integer;
begin
  Len:=Length(m);
  Stream.WriteBuffer(Len,SizeOf(Integer));
  for i:=Low(m) to High(m) do begin
    Len:=Length(m[i]);
    Stream.WriteBuffer(Len,SizeOf(Integer));
    for j:=Low(m[i]) to High(m[i]) do begin
      Len:=Length(m[i][j].X);
      Stream.WriteBuffer(Len,SizeOf(Integer));
      if Len>0 then Stream.WriteBuffer(Pointer(m[i][j].X)^,Len*SizeOf(Real));
      Len:=Length(m[i][j].W);
      Stream.WriteBuffer(Len,SizeOf(Integer));
      if Len>0 then Stream.WriteBuffer(Pointer(m[i][j].W)^,Len*SizeOf(Real));
      Stream.WriteBuffer(m[i][j].Y,SizeOf(Real));
      Stream.WriteBuffer(m[i][j].Err,SizeOf(Real));
    end;
  end;
end;

function ReadFromStreamTYxX(var m: TYxX; Stream: TStream): Boolean;
var Len,i,j: Integer;
begin
  try
    Stream.Position:=0;
    Stream.ReadBuffer(Len,SizeOf(Integer));
    SetLength(m,Len);
    for i:=Low(m) to High(m) do begin
      Stream.ReadBuffer(Len,SizeOf(Integer));
      SetLength(m[i],Len);
      for j:=Low(m[i]) to High(m[i]) do begin
        Stream.ReadBuffer(Len,SizeOf(Integer));
        SetLength(m[i][j].X,Len);
        if Len>0 then Stream.ReadBuffer(Pointer(m[i][j].X)^,Len*SizeOf(Real));
        Stream.ReadBuffer(Len,SizeOf(Integer));
        SetLength(m[i][j].W,Len);
        if Len>0 then Stream.ReadBuffer(Pointer(m[i][j].W)^,Len*SizeOf(Real));
        Stream.ReadBuffer(m[i][j].Y,SizeOf(Real));
        Stream.ReadBuffer(m[i][j].Err,SizeOf(Real));
      end;
    end;
    Result:=True;
  except
    Result:=False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var m,m1: TYxX;
    i,j,k: Integer;
    Stream: TMemoryStream;
begin
  //создали и заполнили
  SetLength(m,2);
  for i:=Low(m) to High(m) do begin
    SetLength(m[i],i+1);
    for j:=Low(m[i]) to High(m[i]) do begin
      SetLength(m[i][j].X,3);
      for k:=Low(m[i][j].X) to High(m[i][j].X) do m[i][j].X[k]:=k+1;
      SetLength(m[i][j].W,2);
      for k:=Low(m[i][j].W) to High(m[i][j].W) do m[i][j].W[k]:=k+5;
      m[i][j].Y:=3;
      m[i][j].Err:=0;
    end;
  end;
  ShowTYxX(m,Memo1); //показали в Memo1

  //запись в поток
  Stream:=TMemoryStream.Create;
  SaveToStreamTYxX(m,Stream);

  //Чтение с потока
  if ReadFromStreamTYxX(m1,Stream) then ShowTYxX(m1,Memo2) else ShowMessage('Error');
  Stream.Free;

end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.01.2017 в 11:18.
Аватар вне форума Ответить с цитированием
Старый 22.01.2017, 13:41   #4
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

ого, я аж испугался, это самый простой вариант?

решил попробовать исправить свое по совету digitalis
теперь выдает ошибку

Код:
var   fs: TFileStream;
i,j,k:Integer;
begin
fs:= TFileStream.Create('Memo\test.txt', fmOpenRead);
  for i := 0 to High(Sloy) do begin  // слои
    fs.Read(Sloy, SizeOf(TYxX));
    for j := 0 to High(Sloy[i]) do begin   ацес виолатион рид оф адрес
      fs.Read(Sloy[i][j], SizeOf(TYxX));
      for k := 0 to High(Sloy[i][j].W) do begin   // веса
        fs.Read(Sloy[i][j].W[k], SizeOf(TYxX));

      end;
    end;
  end;
  fs.Free;;
а сохранение проходит спокойно)) сделал test.txt открыл в текстовом редакторе, не пустой...
а вообще, при старте программы, все массивы у меня инициализируются, вот:

Код:
var PS: Array of Integer = [3]; // Параметры сети.
//  PS: Array of Integer = [33,3300,3300,33]; // Параметры сети.
procedure CreateSetb;  // Создает сеть.
var x,y,i,j,k:Integer;     // i - слой.  j - нейрон. x - веса нейрона.
begin
  Randomize;
  SetLength(Sloy,Length(PS)); // Устанавливаем колличество слоев.
  for i := 0 to Length(Sloy)-1 do begin // Перебераем слои.
    SetLength(Sloy[i],PS[i]);  // Устанавливаем колл нейрон в слое.
    for j := 0 to Length(Sloy[i])-1 do begin // Перебераем нейроны в слое
      if i=0 then begin  // Если слой входной то.
        SetLength(Sloy[i][j].W,900);//= колич. пикселей в Битмап
        SetLength(Sloy[i][j].X,900);//= колич. пикселей в Битмап
      end else begin
      //входов и весов последующих слоев = колличеству нейрон предыдущего слоя
        SetLength(Sloy[i][j].X,PS[i-1]);
        SetLength(Sloy[i][j].W,PS[i-1]);
        for x := 0 to Length(Sloy[i][j].X)-1 do begin//Перебераем веса нейрона.
        Sloy[i][j].W[x]:= (Random(200)-100)/200;
        end;
      end;
    end;
  end;
end;
не знаю нужно заливать весь проект или нет, там срач, творческий))
а сохранять, а потом загружать обратно мне нужно только веса, тоесть Sloy[i][j].W

Последний раз редактировалось Михаил22042016; 22.01.2017 в 13:51.
Михаил22042016 вне форума Ответить с цитированием
Старый 22.01.2017, 13:47   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
а сохранение проходит спокойно)) сделал test.txt открыл в текстовом редакторе, не пустой...
Самое интересное - а что туда написаyно )) открой в hex-редакторе, только там можно убедиться, что записана чепуха
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.01.2017 в 13:49.
Аватар вне форума Ответить с цитированием
Старый 22.01.2017, 14:37   #6
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

в хексе абра кадабра
залил исходник
Вложения
Тип файла: rar 1 Amoba.rar (2.35 Мб, 9 просмотров)

Последний раз редактировалось Михаил22042016; 22.01.2017 в 14:45.
Михаил22042016 вне форума Ответить с цитированием
Старый 22.01.2017, 14:59   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
в хексе абра кадабра
А чего ждал? Двоичные данные же. Вот и разбирайся по байтику чего понаписывал туда
Цитата:
залил исходник
А зачем? Привел же рабочий код записи/чтения Stream
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2017, 15:08   #8
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

да шибко круто для меня, попробую разобраться, мб осилю. спасибо

я вообще надеялся все можно будет замутить проще
типа такого

тут человек говорит пишит динамич. массивы, но только целых чисел
Код:
procedure Save(const FileName: string; const IntegerImage: TIntegerImage);
var
  F: file;
begin
  Result := False;
  AssignFile(F, FileName);
  Rewrite(F, 1);
  try
    WriteToFile(F, IntegerImage );
  finally
    CloseFile(F);
  end;
end;
мне не именно стрим нужно, а вообще сохранить и загрузить, как можно проще

Последний раз редактировалось Михаил22042016; 22.01.2017 в 15:10. Причина: мне не именно стрим нужно, а вообще сохранить и загрузить, как можно проще
Михаил22042016 вне форума Ответить с цитированием
Старый 22.01.2017, 15:16   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

FileStream тоже потомок Stream, так что и его можно параметром передать. Или MemoryStream, он тоже умеет загрузить/выгрузить файл
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2017, 17:25   #10
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

в общем вот решение:
Код:
procedure TForm1.btn4Click(Sender: TObject); // сохранить сеть
const DT: string = 'Memo\test.net';
var
i,j,k:Integer;
f:file of real;
begin

assignfile(f,DT);
rewrite(f);                       // откр. на перезапись
  for i := 0 to High(Sloy) do     // слои
    for j := 0 to High(Sloy[i]) do    // нейроны
      for k := 0 to High(Sloy[i][j].W) do begin   // веса
        write(f,Sloy[i][j].W[k]);
      end;
CloseFile(F);   // закрыли файл.
 ShowMessage('Весовые коэфициенты нейросети записаны!');
end;

procedure TForm1.btn5Click(Sender: TObject); // загр. сеть
const DT: string = 'Memo\test.net';
var
i,j,k:Integer;
f:file of real;
begin

assignfile(f,DT);
Reset(f);
  for i := 0 to High(Sloy) do     // слои
    for j := 0 to High(Sloy[i]) do    // нейроны
      for k := 0 to High(Sloy[i][j].W) do begin   // веса
        Read(f,Sloy[i][j].W[k]);
      end;
CloseFile(F);   // закрыли файл.
 ShowMessage('Весовые коэфициенты загружены!');
end;
Михаил22042016 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Android. Как сохранить/загрузить данные в устройстве в файл (телефон, планшет)? alextrof94 Общие вопросы Delphi 27 04.03.2016 00:31
Сохранить Graphics в файл или считать с него цвет Alexan-Dwer Java Мобильная разработка (Android) 1 05.02.2012 14:19
Как сохранить файл так чтобы он имел расширение ПРИЛОЖЕНИЕ, и сделать потом ярлык? Костян 98 Общие вопросы Delphi 1 03.06.2011 12:10
как записать в файл и считать потом из него три массива с числами racushka_n Помощь студентам 11 31.10.2010 04:43
WinInet загрузить файл во временной файл , использовать, потом удалить Человек_Борща Работа с сетью в Delphi 5 03.08.2010 13:46