Перейти к содержанию
Fire Monkey от А до Я
  • 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 тоже не подходит)

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

Ссылка на комментарий

Рекомендуемые сообщения

  • 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

  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
В 02.04.2018 в 23:27, krapotkin сказал:

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

Подскажите, а в чём принципиальная разница между типизированным файлом и JSON? Как это влияет на сохранение небольшого количества данных и использование в дальнейшем? Для записи в типизированный файл не нужны дополнительные библиотеки, в отличии от использования JSON.

Ссылка на комментарий
  • 0

Принципиальная разница такова

Опыт подсказывает, что ничего неизменного нет. И через какое-то время клиент с безумными глазами прибегает и сообщает, что вот буквально еще одно-два поля ему так необходимы, что просто спать не может

В случае БД или JSON вы просто добавляете поле и уходите заниматься своими делами, а если у вас старые файлы типизированных записей, то появятся еще новые файлы типизированных записей, которые будут несовместимы со старыми

Начнется изобретение системы версий и всего такого.

А еще хуже - хранение Unicode строк в типизированных файлах, мягко говоря, - задача с небольшой звездочкой.

 

Про "дополнительные" библиотеки:

У вас в каждой программе есть примерно 20 Мб всяких библиотек. Если туда добавится 100Кб, на что это повлияет? Вам же их - не писать?

 

Ссылка на комментарий
  • 0
13 часов назад, OnePeople сказал:

В чем разница между человеком и ногой?

Вам к психологу обратиться не мешало бы! Тоже мне, доктор Хаус очередной.

А если отвечать на Ваш вопрос по теме, то без разницы - и там, и там можно сделать запись татуировкой.

Изменено пользователем Hevard
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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