Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Вниз(Специфичный случай) Сохранение строк в байтовом формате Найти похожие ветки
← →
dm_member © (2012-09-18 19:24) [0]Думаю уже неделю, все способы пробовал, какие знал.
Специфика вот в чём:
Есть запись и указатель на неё
PTRec=^TRec;
TRec=record
name: string;
str_array: array of string;
end;
var Rec: array of PTRec;
Т.е. динамические массивы. Надо серию таких записей из памяти сохранить в один файл, чтобы потом нормально считать из файла в память. Я знаю, что в файле надо сначала записывать длину каждого массива, чтобы потом знать, сколько памяти выделять через SetLength, затем сохранять строки. Всегда при загрузке строки были искажены и всё больше искажались по мере добавления новых записей.
Вопрос: как перевести строку в байты, сохранить в файл, затем загрузить из файла, перевести в строку.
Помогите решить задачу.
------
Владимир
← →
MBo © (2012-09-18 19:27) [1]>в файле надо сначала записывать длину каждого массива, чтобы потом знать, сколько памяти выделять через SetLengt
Верно. Кроме того, для строк такая же ситуация - записать длину, потом тело строки
← →
Eraser © (2012-09-18 19:29) [2]
> dm_member © (18.09.12 19:24)
S: string;
...
указатель на начало строки
Pointer(S)
разыменование
Pointer(S)^
длина строки
Length(S) * SizeOf(Char);
← →
брат Птибурдукова (2012-09-18 19:37) [3]
> указатель на начало строкиPointer(S)
Хрен. @S[1]
← →
Baks (2012-09-18 19:38) [4]
var
F: File;
Len: Integer;
Str: String;
Запись строки:
Len := Length(Str);
BlockWrite(F, Len, SizeOf(Len));
BlockWrite(F, PChar(Str)^, Length(Str));
Чтение строки:
BlockRead(F, Len, SizeOf(Len));
SetLength(Str, Len);
BlockRead(F, PChar(Str)^, Length(Str));
← →
брат Птибурдукова (2012-09-18 19:46) [5]
> Baks (18.09.12 19:38) [4]
Сохраняет полстроки, вычитывает полстроки, вторая половина заполнена мусором. Что я делаю не так?
← →
Eraser © (2012-09-18 19:47) [6]
> брат Птибурдукова (18.09.12 19:37) [3]
это не рекомендуемая запись.
← →
Ega23 © (2012-09-18 19:49) [7]
> Сохраняет полстроки, вычитывает полстроки, вторая половина
> заполнена мусором. Что я делаю не так?
ПропускаешьLength(Str)*SizeOf(Char)
string давно уж юникодный.
← →
брат Птибурдукова (2012-09-18 19:50) [8]
> Ega23 © (18.09.12 19:49) [7]
Эт не я пропускаю, а автор совета ;-)
← →
Ega23 © (2012-09-18 19:51) [9]
> dm_member © (18.09.12 19:24)
> Т.е. динамические массивы. Надо серию таких записей из памяти
> сохранить в один файл, чтобы потом нормально считать из
> файла в память.
Если Delphi версии 2010 и выше, то можно прямо рекорду методы SaveToStream и LoadFromStream прикрутить
← →
Ega23 © (2012-09-18 19:52) [10]
> Эт не я пропускаю, а автор совета ;-)
А, ну извини, я не так понял. Автор - да, тоже проигнорировал.
← →
брат Птибурдукова (2012-09-18 19:53) [11]
> Eraser © (18.09.12 19:47) [6]
Нда, фигню сморозил. Действительно, Pointer(S) = @S[1] <> @S
← →
dm_member © (2012-09-18 20:30) [12]Ладно, имеется:
var:
s: array of string;
кто-нибудь может написать, как сохранить каждую строку этого массива в файл и потом прочитать его оттуда? Пожалуйста, если советуете, старайтесь не забывать важные моменты, без которых код будет нерабочим. Это ведь всего пара строчек, не так сложно. Для меня эта задача новая и я не решил её пока ни одним из известных мне способов. Имейте терпение и понимание.
← →
брат Птибурдукова (2012-09-18 20:32) [13]
> я не решил её пока ни одним из известных мне способов
Так ты хоть приведи способы, какие пробовал. А то пока выглядит — вынь да положь решение за просто так.
← →
Eraser © (2012-09-18 20:50) [14]
> брат Птибурдукова (18.09.12 20:32) [13]
TStringList
← →
Медвежонок Пятачок © (2012-09-18 20:52) [15]если уж колхозить, то по взрослому.
есть массив?
значит TWriter + writelistbegin + writrlistend + writestring между ними в цикле.
← →
Медвежонок Пятачок © (2012-09-18 20:56) [16]а если не колхозить, то убрать вообще эту структуру.
данные занести в dom и везде где раньше передавался указатель на запись использовать ixmldomnode.
бесплатный бонус- сохранение в файл и загрузка из файла одним вызовом. save и load
← →
dm_member © (2012-09-18 20:56) [17]TStringList пробовал, не получилось.
Вот пример сохранения массива строк. Не работает:
procedure TForm1.Button1Click(Sender: TObject);
var f:file;
i,c:integer;
begin
assignfile(f, "1.txt");
rewrite(f);
c:=length(s);
BlockWrite(f, c, sizeof(integer));
for i:=0 to length(s)-1 do
begin
c:=length(s[i])*sizeof(char);
BlockWrite(f, c, sizeof(integer));
BlockWrite(f, s[i], c);
end;
closefile(f);
end;
Если можно, что не так сделал, по порядку объясните.
← →
dm_member © (2012-09-18 20:58) [18]
> Медвежонок Пятачок © (18.09.12 20:56) [16]
Ваш язык мне непонятен, извините..
← →
Медвежонок Пятачок © (2012-09-18 21:00) [19]сморти второй параметр у блокрайт. когда строку пишешь.
что там должно быть и что у тебя
← →
Медвежонок Пятачок © (2012-09-18 21:02) [20]а мне твои мучения непонятны. зачем вся эта канитель?
← →
Eraser © (2012-09-18 21:02) [21]
> dm_member © (18.09.12 20:56) [17]
> TStringList пробовал, не получилось.
еще пробуй.
← →
Медвежонок Пятачок © (2012-09-18 21:03) [22]третий пост последняя строчка
← →
dm_member © (2012-09-18 21:10) [23]
> Медвежонок Пятачок © (18.09.12 21:02) [20]
Мне кажется странным способ вашего участия. Вам не нужно знать, "зачем вся эта канитель", вы просто могли бы дать ответ на таком же простом языке, на каком задан вопрос.
> Eraser © (18.09.12 21:02) [21]
...
ещё пробуй
Если бы ко мне обратились с таким простым вопросом и я знал бы ответ, я бы дал этот ответ. Я бы не стал говорить что-то вроде "что ты тут требуешь от нас готовенькое" или "сам пробуй, пробуй ещё, давай-давай, сам, сам". К вам обратились за помощью, уважительно, но вам, видимо, не хватает в жизни тех, в сравнении с кем можно почувствовать себя умнее и вы ловите момент здесь, чтобы показать себя.
← →
Eraser © (2012-09-18 21:13) [24]
> dm_member © (18.09.12 21:10) [23]
ёмоё, у тебя инет под рукой есть, что еще надо то, дружище. из принципа не даю готовые решения товарищам как ты.
← →
Медвежонок Пятачок © (2012-09-18 21:16) [25]на простом языке:
откажись от рекорда. тип данных выбран неверно, если его запись в файл и чтение из файла вызывает у тебя такие титанические трудности.
предлагаю заменить твой рекорд xml документом.
загрузка из файла:
xdoc.load(filename);
сохранение в файл:
xdoc.save(filename);
разницу ощущаешь?
← →
Медвежонок Пятачок © (2012-09-18 21:18) [26]и вы ловите момент здесь, чтобы показать себя.
мне просто больно смотреть на твои мучения на ровном месте.
все
← →
Медвежонок Пятачок © (2012-09-18 21:18) [27]и вы ловите момент здесь, чтобы показать себя.
мне просто больно смотреть на твои мучения на ровном месте.
всего лишь
← →
брат Птибурдукова (2012-09-18 21:23) [28]
> вы ловите момент здесь, чтобы показать себя
Да, здесь, в "Прочем" мы ловим момент, почему бы и нет?
← →
dm_member © (2012-09-18 21:27) [29]
> Eraser © (18.09.12 21:13) [24]
Хорошая помощь, ётвоё. Ты не даёшь "готовые решения" не из принципа, у тебя он вряд ли есть. Скорее из-за своего страха. Если для тебя этот маленький вопрос - такая большая важность, сберечь свой ответ, свою прелесть, не сказать никому, то у тебя, видимо, вообще мало что есть в запасах и ты дорожишь даже такой ерундой. Таких как ты пол страны, которые относятся как к недостойным к тем, кто в чём-то меньше осведомлён. Только вот ты сидишь там и строишь из себя принципиального знатока, а кому это нужно, кроме тебя? Зачем вообще ты взялся отвечать на этот вопрос? Задумайся о том, какова твоя роль в этой жизни помимо понтов.
← →
Медвежонок Пятачок © (2012-09-18 21:29) [30]оно философ или оно психолог?
← →
брат Птибурдукова (2012-09-18 21:30) [31]оно member
← →
Inovet © (2012-09-18 21:32) [32]> [29] dm_member © (18.09.12 21:27)
> а кому это нужно, кроме тебя?
Вот! Только теперь эту фразу к себе примени. Здесь достаточно ответили для понимания, ты же просишь написать готовое.
← →
dm_member © (2012-09-18 21:32) [33]Удалено модератором
Примечание: Достал
← →
Inovet © (2012-09-18 21:33) [34]> [30] Медвежонок Пятачок © (18.09.12 21:29)
> оно философ или оно психолог?
Оно хочет решать не свою задачу, а хочет помочь вам в решении ваших проблем.
← →
DevilDevil © (2012-09-18 21:42) [35]> dm_member © (18.09.12 21:32) [33]
procedure WriteString(const Stream: TStream; const S: string);
var
L: integer;
begin
L := Length(S);
Stream.Write(L, sizeof(L));
if (L <> 0) then Stream.Write(pointer(S)^, L*sizeof(char));
end;
procedure ReadString(const Stream: TStream; var S: string);
var
L: integer;
begin
Stream.Read(L, sizeof(L));
SetLength(S, L);
if (L <> 0) then Stream.Read(pointer(S)^, L*sizeof(char));
end;
type
TStringDynArray = array of string; // скорее всего такой тип уже есть в модуле Types
procedure WriteStrings(const Stream: TStream; const Strings: TStringDynArray);
var
L, i: integer;
begin
L := Length(Strings);
Stream.Write(L, sizeof(L));
for i := 0 to Len-1 do
WriteString(Stream, Strings[i]);
end;
procedure ReadStrings(const Stream: TStream; var Strings: TStringDynArray);
var
L, i: integer;
begin
Stream.Read(L, sizeof(L));
SetLength(Strings, L);
for i := 0 to Len-1 do
ReadString(Stream, Strings[i]);
end;
← →
Медвежонок Пятачок © (2012-09-18 21:43) [36]плохо чего-то хочет.
раз так быстро сдалось
← →
DevilDevil © (2012-09-18 21:49) [37]all
программист которому нравится рутина - плохой программист
на то и форум, чтобы тут помогали, а не чтобы глумились и самоутверждались
← →
Inovet © (2012-09-18 21:55) [38]> [37] DevilDevil © (18.09.12 21:49)
Ты и здесь за своё. Автору дали нормальные ответы, потом он начал обижаться на отсутсвие кода и искать проблемы у других.
← →
DevilDevil © (2012-09-18 21:58) [39]> Inovet © (18.09.12 21:55) [38]
программист у которого всё всегда получается - не программирует
← →
Jeer © (2012-09-18 22:02) [40]
> на то и форум, чтобы тут помогали,
Это твое частное мнение, что помогать надо готовым кодом, учти.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.07 c