Главная страница
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]


> на то и форум, чтобы тут помогали,


Это твое частное мнение, что помогать надо готовым кодом, учти.



Страницы: 1 2 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.11 c
3-1287144551
IvanKonst
2010-10-15 16:09
2013.03.22
построения графа по базе данных


15-1342737184
Германн
2012-07-20 02:33
2013.03.22
Братья с Украины. Где в Одессе


2-1343328927
Alez
2012-07-26 22:55
2013.03.22
Microsoft OneNote


3-1285224678
Раиса
2010-09-23 10:51
2013.03.22
MS SQL 2000 и MySQL - результат разный?


15-1351849926
Dmitry87
2012-11-02 13:52
2013.03.22
редактор контролов