Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1349326643
Думкин
2012-10-04 08:57
2013.03.22
С Днем спутника!


3-1287589173
Grom
2010-10-20 19:39
2013.03.22
БД+КЛиент-сервер(сокеты) DELPHI


15-1331145882
Dimka Maslov
2012-03-07 22:44
2013.03.22
Чё то до меня не доходит?


15-1345335302
Германн
2012-08-19 04:15
2013.03.22
Формат двоичного представления дробного числа


6-1233066271
Usov
2009-01-27 17:24
2013.03.22
Как можно реализовать многосекционную закачку файла по http?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский