Форум: "Прочее";
Текущий архив: 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]
> на то и форум, чтобы тут помогали,
Это твое частное мнение, что помогать надо готовым кодом, учти.
← →
Медвежонок Пятачок © (2012-09-18 22:02) [41]ищё один хвилосов
← →
Ega23 © (2012-09-18 22:04) [42]
> программист у которого всё всегда получается - не программирует
программист, который не хочет найти (пусть и с подсказками) решение, а ищет готовый код - не программист.
← →
Dimka Maslov © (2012-09-18 22:09) [43]Ещё один пцрепаир. Как это печально.
← →
Inovet © (2012-09-18 22:09) [44]> [39] DevilDevil © (18.09.12 21:58)
> программист у которого всё всегда получается - не программирует
Интересный тезис с бесконечно малыми и большими. У программиста, который программирует - ничего и никогда не получается. Почему автор не стал вникать в ответы? Он из первой категории или из второй?
← →
DevilDevil © (2012-09-18 22:14) [45]Удалено модератором
← →
Pavia © (2012-09-18 22:14) [46]
> allпрограммист которому нравится рутина - плохой программистна
> то и форум, чтобы тут помогали, а не чтобы глумились и самоутверждались
Вы форумом ошиблись.
← →
DevilDevil © (2012-09-18 22:18) [47]Удалено модератором
← →
Jeer © (2012-09-18 22:21) [48]
> DevilDevil © (18.09.12 22:14) [45]
Образование у меня вполне советское и учили меня так, что горжусь Учителями.
Только никто мне кашку на ложечке в открытый ротик не вкладывал, да и не было этого "ротика", а была пахота, когда за знания мы "дрались".
Вот этого я не вижу часто в сегодняшней молодежи и таких, как ТС.
Ну и форум - это не учебный класс.
Хотите - организуйте здесь учебу, может у Вас и получится, только вряд ли - забросите на 2-3 ученике.
← →
Медвежонок Пятачок © (2012-09-18 22:21) [49]кто вообще решил, и с чего вдруг,что здесь над этим типчиком глумились?
← →
Inovet © (2012-09-18 22:23) [50]> [49] Медвежонок Пятачок © (18.09.12 22:21)
Пока только двое из присутсвующих.
← →
Jeer © (2012-09-18 22:25) [51]
> кто вообще решил, и с чего вдруг,что здесь над этим типчиком
> глумились?
>
У группы поддержки ТС очень тонкое чувство между гранями добра и зла, ну еще и высокоразвитое чувство эстетства не позволяет не привести здесь исходный код, в котором ТС все равно ни фига не поймет.
← →
DevilDevil © (2012-09-18 22:28) [52]Удалено модератором
← →
Медвежонок Пятачок © (2012-09-18 22:32) [53]ему был предложен мегапростой способ записи всего списка структур в файл.
одним единственным методом.
одним методом с одним параметром - весь список структур целиком в файл.
а так , он конечно рад бы драться за знания.
только нифига драка не получается.
← →
Медвежонок Пятачок © (2012-09-18 22:37) [54]три раза как минимум объяснили прямым текстом почему в файл у него пишется мусор вместо строк.
но не способен моск понять отличие указателя от адреса.
и вместо драки за знания начинается жеманное умничание на тему вы не так мне помогаете построить коммунизм в отдельно взятой программе.
← →
Inovet © (2012-09-18 22:38) [55]Удалено модератором
← →
DevilDevil © (2012-09-18 22:39) [56]> Медвежонок Пятачок © (18.09.12 22:32) [53]
xml это конечно здорово. И TWriter не плох.
Но кто будет учиться писать бинарные файлы?
Если говорить обо мне - я постоянно натыкался на то, что забывал Length записывать/читать.
← →
Inovet © (2012-09-18 22:41) [57]> [56] DevilDevil © (18.09.12 22:39)
Ну так ТС, вроде как не забыл в одном месте, в другом напомнили.
← →
Медвежонок Пятачок © (2012-09-18 22:41) [58]а при чем здесь ленс, если он тип параметра не хочет понимать.
даже после трех подсказок.
← →
DevilDevil © (2012-09-18 22:41) [59]Удалено модератором
← →
Eraser © (2012-09-18 22:42) [60]
> dm_member © (18.09.12 21:27) [29]
я тебе дал бесплатно 2 рабочие подсказки, а ты в ответ нахамил. задумайся над своим поведением )
← →
DevilDevil © (2012-09-18 22:42) [61]> а при чем здесь ленс, если он тип параметра не хочет понимать.
> даже после трех подсказок.
подкрепи свой тезис текстом.
я может что-то пропустил.
← →
dm_member © (2012-09-18 22:43) [62]Удалено модератором
← →
Медвежонок Пятачок © (2012-09-18 22:47) [63]подкрепи свой тезис текстом.
я может что-то пропустил.
пропустил - читай ветку с первого поста.
загибай пальцы.
насчитаешь три (минимум) прямых подсказки на счет того, почему у него строка пишется неправильно.
← →
DevilDevil © (2012-09-18 22:47) [64]Удалено модератором
← →
dm_member © (2012-09-18 22:54) [65]Удалено модератором
← →
DevilDevil © (2012-09-18 22:59) [66]Удалено модератором
← →
Медвежонок Пятачок © (2012-09-18 23:00) [67]а ты якобы хорошо пытаешься.
← →
Inovet © (2012-09-18 23:00) [68]Удалено модератором
← →
Anatoly Podgoretsky © (2012-09-19 07:11) [69]> dm_member (18.09.2012 20:56:17) [17]
Для начала откажись от типа file, смени на TFileStream
← →
app © (2012-09-19 07:15) [70]
> dm_member © (18.09.12 21:27) [29]
Кончай наезжать, плохо кончится.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.067 c