• 0
dim

сохранение массива в файл

Вопросы

Подскажите как сохранить в файл типизированный массив под андроид, раньше делал:

   TMyRec = record
    id    : string;
    name  : string;
    nomer : string;
    fio   : string;
  end;
TMyList = array of TMyRec;
MyList:TMyList;
......

f:file of TMyRec;
MyRec:TMyRec;
begin
  AssignFile(F,path);
  Rewrite(F);
  Seek(F,0);
  rz:=High(MyList);
  for i := 0 to rz do begin
    MyRec:=MyList[i];
    Write(F,MyRec);
  end;

для андроида этот код не работает ошибка на f:file of TMyRec; так как использую string  (string[x] и shortstring тоже не подходит)

подскажите как можно еще массив сохранить в файл и считать его потом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 ответов на этот вопрос

  • 0

это какбы из 90-х код-то... Да еще и нерабочий.

Никто сейчас строки не хранит в типизированном файле...

Храните в БД или хотя бы в JSON. Вот тут я расписывал подходы

http://www.cyberforum.ru/blogs/469693/blog4883.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Возможно проще будет хранить в TiniFile файле, если их немного. К примеру языковой файл - пару килобайт самое то. Просто и быстро.

 

В Delphi для работы с файлами используют стримы. AssignFile устарел еще лет 15 тому назад, это наследство из ТурбоПаскаля. См TFileStream и др.  - их нужно использовать.

Изменено пользователем ENERGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

 record можно сохранять в файл через blockwrite, если там только атомарные элементы. String имеет сложную структуру, и этот фокус не прокатит.

Так что либо сериализовать/десериализовать структуру через RTTI и потом сохранить в бинарный/XML... файл,  или ручками в базу/ini/StringList... в общем в более высокоуровневую запись.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

пришлось через ini делать, просто сроки поджимают по этому надо то что быстро реализовать и будет работать

по поводу хранить в JSON надо будет реализовать на будущее, вот почему в FireMonkey все через ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 часов назад, krapotkin сказал:

это какбы из 90-х код-то... Да еще и нерабочий.

Никто сейчас строки не хранит в типизированном файле...

Храните в БД или хотя бы в JSON. Вот тут я расписывал подходы

http://www.cyberforum.ru/blogs/469693/blog4883.html

считывание и запись структурированных данных будет быстрее чем чтение и парсинг json или тем более запись в локальную бд если нужно просто считать данные и залить в массив. а вот поиск да фильтрация там да бд нужна. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

в моем коде акцент не на запись в файл (это я для примера вставил, даже не смотрел будет ли работать), а на объявление переменной f:file of TMyRec которую с строками я не могу выполнить. Да можно извратиться вместо string объявить array[1..25] of char, но это усложняет реализацию.

и haword прав, когда тупо надо скинуть массив в файл то такая запись работает проще и быстрее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

да какой же акцент

никогда! запись со string нельзя было записать в типизированный файл

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

string[x] или shortstring и все будет писаться (в обычной Delphi)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

  TArrByte = array[0..250] of Byte;
  TMyRec = record
    id    : TArrByte;
    name  : TArrByte;
    nomer : TArrByte;
    fio   : TArrByte;
  end;

будет работать и под андроидом. только вот надо извратиться что бы заполнить массив байтов юникодными символами 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Не знаю на сколько вам это подойдет, но у меня запись и чтение в стрим (это может быть хоть файл, хоть мемористрим) происходит так:

procedure SaveToStream(const AStream: TStream);
var
  buff: TBytes;
  myString: string;
begin
  ...
  myString := 'some string';
  buff := TEncoding.UTF8.GetBytes(myString);
  l := Length(buff);
  AStream.Write(l, SizeOf(l));
  AStream.WriteBuffer(buff, l);
  ...
end;

Чтение:

procedure LoadFromStream(const AStream: TStream);
var
  l: Integer;
  buff: TBytes;
  myString: string;
begin
  ...
  AStream.Read(l, SizeOf(l));
  SetLength(buff, l);
  AStream.ReadBuffer(buff, l);
  myString := TEncoding.UTF8.GetString(buff);
  ...
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу