|
Вопрос # 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]:
Я часто писал Ваш, но порой когда сильно загруженый не услеживаю за этим...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|