0 голосов
 
627 просмотров
25.11.2020 / 20:22  GOAR

AMPASIDE : Как правильно сохранить данные в файл?

Как правильно сохранить данные в файл?
В моем случае это массив world [x,y].

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

Помогите пожалуйста, для игры нужно.
Желательно пример..
Ответы
 
1 голос
 
# 26.11.2020 / 21:07  vlavolk
https://annimon.com/article/1908
26.11.2020 / 21:44  GOAR
Ничего не понял, но очень интересно
 
1 голос
 
# 26.11.2020 / 00:28  Витаминыч
Строчка и должна быть. Поэтому мне интересно, что ты себе представил в качестве записи в хранилище?

https://annimon.com/article/853
26.11.2020 / 05:40  GOAR
Витаминыч, запись в rms нагружает тем что сохранение длится около 8 минут.
Это при том что массив [0..256, 0..128].
26.11.2020 / 21:34  Витаминыч
Какой тип массива?
В этом паскале ты можешь либо цифры хранить, либо строки.
27.11.2020 / 12:19  GOAR
Витаминыч, короче код такой:

uses rms; // старая либа, до обновления katler'ом //

procedure savemap;
var i, x, y: integer;
       map: array[0..63,0..128] of integer;
       rs:recordstore;
begin
  rs:=openrecordstore ('map');
  i:=1;
   for x:=0 to 63 do
    for y:=0 to 128 do
     begin
      i:=rms.addstring(rs,''+map[x,y]);
      rms.savestring(rs,''+map[x,y],i);
     i:=i+1;
     end;
closerecordstore(rs);
end;

в этом коде все сохраняет , но оч долго примерно 8 минут. Не знаю п
 
0 голосов
 
# 27.11.2020 / 21:01  Витаминыч
Если ты пользуешься какой-то другой версией, то давай на нее ссылку, чтобы можно было почитать документацию. В основном проблема в том, что 8256 значений integer перегоняется в string. Также непонятно, из какого места вызывается процедура. А вот пример для либы, на которую я оставил ссылку:
  1. uses rms;
  2. {
  3. Весь массив будет тупо сохранён одной записью
  4. как одномерный массив из 8256 значений, например: 34 22 1 ... 5 345 23 ...
  5. Хз, насколько это удобно
  6. }
  7. procedure SaveMap;
  8. var
  9.   x, y: integer;
  10.   map: array[0..63, 0..127] of integer;
  11. begin
  12.   rms.Open('map');
  13.   for x:=0 to 63 do
  14.   begin
  15.     for y:=0 to 127 do
  16.     begin
  17.       rms.PrintInteger(map[x, y]);
  18.     end;
  19.   end;
  20.   rms.Add;
  21.   rms.Close;
  22. end;
  23.  
  24. {
  25. Этот вариант удобнее использовать, когда у тебя карта
  26. записывается в отдельное хранилище. Записей в ней будет Х,
  27. каждая запись содержит Y значений:
  28. 34  22  1  ...
  29. 5   345 23 ...
  30. ...
  31. }
  32. procedure SaveMap;
  33. var
  34.   x, y: integer;
  35.   map: array[0..63, 0..127] of integer;
  36. begin
  37.   rms.Open('map');
  38.   for x:=0 to 63 do
  39.   begin
  40.     for y:=0 to 127 do
  41.     begin
  42.       rms.PrintInteger(map[x, y]);
  43.     end;
  44.     rms.Add;
  45.   end;
  46.   rms.Close;
  47. end;
Изм. Витаминыч от 28.11.2020 / 17:03
28.11.2020 / 06:12  GOAR
Благодарю :)
28.11.2020 / 10:32  GOAR
А как в файл записать не подскажите?)
:)
28.11.2020 / 18:09  Витаминыч
  1. jsr75.write_byte(b: integer); // b = map[x, y]
  2. jsr75.write_string(s: string);
  3. jsr75.write_file_a(name: string, info: string); // info = ToString(map)

1. Ты можешь записывать байты напрямую. Запись именно в файл происходит после вызова оператора flush. Размер файла маленький
2. Значения массива можно преобразовать в строку и построчно формировать файл. Размер файла большой.
3. Весь массив можно преобразовать в одну строку. Размер файла средний.
28.11.2020 / 23:17  GOAR
а когда как прочитать то? надо разбивать строки?
29.11.2020 / 09:17  Витаминыч
Как запишешь так и считывай :stul:

Я рекомендую посмотреть на байты, а там конечно как хочешь
 
0 голосов
 
# 27.11.2020 / 18:43  vlavolk
GOAR, в твоем примере долго сохраняется потому что ты склалываешь строки, а это длительная операция. Сохраняй массив как последовательность чисел (код может не рабочий, но суть ясна):
  1. uses rms; // старая либа, до обновления katler'ом //
  2.  
  3. procedure savemap;
  4. var i, x, y: integer;
  5.        map: array[0..63,0..128] of integer;
  6.        rs:recordstore;
  7. begin
  8.   rs:=openrecordstore ('map');
  9.   i:=1;
  10.    for x:=0 to 63 do
  11.     for y:=0 to 128 do
  12.      begin
  13.       rms.printInteger(map[x,y]);
  14.       i:=i+1;
  15.      end;
  16. closerecordstore(rs);
  17. end;
Изм. vlavolk от 27.11.2020 / 18:44
27.11.2020 / 19:53  GOAR
Мм ну попробую
27.11.2020 / 20:35  GOAR
Используя эту либу, которую katler модифицировал, при попытке сохранения оно вылетает ошибкой
Всего: 4

Реклама

Мы в соцсетях

tw tg yt gt