Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

(Специфичный случай) Сохранение строк в байтовом формате   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.062 c
2-1329910656
SIV5000
2012-02-22 15:37
2013.03.22
Копирование файлов ОС


15-1347476011
ussr
2012-09-12 22:53
2013.03.22
OpenGL


15-1338218111
brother_home
2012-05-28 19:15
2013.03.22
опять ностальгия!


6-1256894586
noname123
2009-10-30 12:23
2013.03.22
tidtunnelmaster и tidtunnelslave


15-1343674849
alexdn
2012-07-30 23:00
2013.03.22
php