| 
| 
 | Вопрос # 2 809/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Координаты точек хранятся в массиве APnt:array [1..maxpnt,1..2] of integer;
 Задаются координаты следующим образом:
 Pnt:=Pnt+1;
 APnt[Pnt,1]:=X;
 APnt[Pnt,2]:=Y;
 Мне необходимо реализовать сохранение координат в файл, и загрузку координат из файла... Если с загрузкой еще можно повозиться, то с сохранением я вообще не соображаю.
 Край сройно нужно. На всякий случай цепляю файл.
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: Ozz (статус: Посетитель)Вопрос отправлен: 18 мая 2009, 18:39
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Вот, набросал тебе пример. Это не руководство к действию, т.е. не надо тупо копипастить к себе в код, а разобраться в концепции. Это просто пример.
 const
  maxpnt = 100; // для примера
 
type
  TPointArray = array [1..maxpnt, 1..2] of integer;
 
function LoadPointArray(var PA: TPointArray; const FileName: string): Boolean;
var
  Index: Integer;
  FS: TFileStream;
  IntBuf: Integer;
begin
  try
    FS:= TFileStream.Create(FileName, fmOpenRead);
    try
      for Index:= 0 to maxpnt - 1 do
        begin
          FS.ReadBuffer(IntBuf, 4); // Чтение Х
          PA[Index, 1]:= IntBuf;
          FS.ReadBuffer(IntBuf, 4); // Чтение Y
          PA[Index, 2]:= IntBuf;
        end;
    finally
      FS.Free();
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;
 
function SavePointArray(const PA: TPointArray; const FileName: string): Boolean;
var
  Index: Integer;
  FS: TFileStream;
begin
  try
    FS:= TFileStream.Create(FileName, fmOpenWrite);
    try
      for Index:= 0 to maxpnt - 1 do
        begin
          FS.WriteBuffer(PA[Index, 1], 4); // Запись Х
          FS.WriteBuffer(PA[Index, 2], 4); // Запись Y
        end;
    finally
      FS.Free();
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;Ахтунг! Не отлаживал, писал на коленке!
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 18 мая 2009, 19:07
 Оценка за ответ: 2
 Комментарий к оценке: Не плохо, но сложновата реализация. |  
 Мини-форум вопросаВсего сообщений: 13; последнее сообщение — 19 мая 2009, 12:08; участников в обсуждении: 4. 
|   | Вадим К (статус: Академик), 18 мая 2009, 19:01 [#1]:А как Вы собрались делать загрузку, если сохранить не можете? Для начала надо определиться, как именно хочеться сохранять. Может применить наиболее простой метод - просто все точки одним скопом. То есть, одна точка - 2 строки в файле.
 А в первой строке можно записать общее кол-во строк, хотя и не обязательно. Если применить TStringList, то вообще просто может получиться.
 ну где то так
 sl:=TStringList.Create;
 for i:= 0 to length(APnt)-1 do begin
 sl.Add(inttostr(APnt[i,1]);
 sl.Add(inttostr(APnt[i,2]);
 end;
 sl.SaveToFile('file.txt');
 sl.free;
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ozz (статус: Посетитель), 18 мая 2009, 19:26 [#2]:Вадим, выручил, благодарю... (хоть в этом вопросе не послали чего качать...) |  
|   | Вадим К (статус: Академик), 18 мая 2009, 19:34 [#3]:здесь не нужно было ничего качать. Можно было и через обычную работу с файлами написать (через AssingFile и так далее), но это по настроению. to min@y™. Надо было хотя бы кол-во точек записывать, а то в противном случае получается плохая реализация.
 А вот за то, что размер integer поставлен как 4, надо назказывать. Кто сказал, что он будет 4 байта. Вот в паскале он был 2 байта. а в 64битной делфи, которая должна по идеи появиться - должен быть 8 байт...
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ozz (статус: Посетитель), 18 мая 2009, 19:50 [#4]:Нда, я что-то не понял, я теперь загрузить в этот массив не могу по методу Вадима... тоже нужно содавать StringList? |  
|   | Паровоз (статус: 10-ый класс), 18 мая 2009, 19:53 [#5]:Напрашиваются два комментария: 1) для автора вопроса: "Не плохо, но сложновата реализация."
 Удивительная по своему безобразию оценка - если "не плохо", то почему же оценка "плохо"?
 
 2) для min@y™:
 Вот так и оказывают помощь двоечникам - они Вас используют, а ставят два.
 |  
|   | Вадим К (статус: Академик), 18 мая 2009, 19:59 [#6]:у min@y™ задумка хорошая, но не до конца реализована, далеко не до конца. Реализацию надо выбирать по уровню того, кто срашивает. Да, я мог написать с красивым сохранением в базу и так дальше, но тут этого не надо. to Ozz.
 Загрузка примитивна.
 
 sl:=TStringList.Create;
sl.LoadFromFile('file');
n := sl.count div 2;
SetLength(APnt, n);
for i:= 0 to n - 1 do
  begin
    APnt[i,1] := StrToInt(sl[i*2]);
    APnt[i,2] := StrToInt(sl[i*2+1]);
  end;
sl.free;В коде вообще то не помешало пару проверочек. размеры массива и так дальше. Но это потом, по желанию.Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 18 мая 2009, 20:10 [#7]:2 Ozz: Считаю оценку НЕСПРАВЕДЛИВОЙ и требую объяснений!
 Я написал, что это не есть готовый код.
 Больше я на твои вопросы отвечать не буду. Потратил целых 10 минут своей жизни (а она у меня одна) на написание ответа, а что получил? Лучше бы вообще оценку не ставил.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ozz (статус: Посетитель), 18 мая 2009, 20:32 [#8]:Паравоз, никто никого не использует, тут каждый сам вызвался помогать, ну не понял я предложенного ответа, мне не сложно, я могу и пять поставить, но получится что не за что... Лично я сужу помогло или не помогло... min@y™ ну извини, я твой код и сверху вниз и снизу вверх пересмотрел, стартовать стартует, и свои значения, и свои параметры наставил, но я его потом даже вызвать эти события не смог (признаю, видимо я совсем тупой). Хочешь, в оправдание в репу дам тебе плюсом?
 Вадим, извини что совсем туплю, я одним глазом уже сплю, а завтра сдавать... Проблема в SetLength(APnt,n), неверное задание параметров, всевозможные варианты переставил, не фурычит, а без него выдает только одну точку, и то в левом верхнем углу, которой не должно быть по идеи.
 |  
|   | min@y™ (статус: Доктор наук), 18 мая 2009, 20:40 [#9]:А я предупреждал, что код нерабочий. Это пример использования TFileStream для загрузки/сохранения подобных данных. Остальное надо было придумать, поставив свои мозги в положение "ВКЛ". Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Паровоз (статус: 10-ый класс), 18 мая 2009, 23:38 [#10]:To Ozz: Ну так два зачем же ставить, если сам охарактеризовал ответ как "Не плохо, но сложновата реализация"? Это никак не два потому что два  - это плохо.
 |  
|   | Ozz (статус: Посетитель), 19 мая 2009, 11:12 [#11]:Вадим, так и не понял почему в твоем коде ошибку выдает, но он помог додуматься до другого метода... так что вопрос исчерпан, спасибо всем (и извините за оценки)! var
 f : TextFile;
 x,y  : integer;
 begin
 AssignFile(f,'file.txt');
 reset(f);
 While not Eof(f) do
 begin
 Pnt:=Pnt+1;
 ReadLn(f,x);
 ReadLn(f,y);
 APnt[Pnt,1]:=x;
 APnt[Pnt,2]:=y;
 end;
 |  
|   | Вадим К (статус: Академик), 19 мая 2009, 11:32 [#12]:Во первых - если возникает ошибка - пишем какая, я иногда проявляю дар телепатии, но пока не регулярно, голова не выдерживает... Во вторых, вообще то "Ваш", а не "Твой", но это так, между прочим.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ozz (статус: Посетитель), 19 мая 2009, 12:08 [#13]:Я часто писал Ваш, но порой когда сильно загруженый не услеживаю за этим... |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |