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


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


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



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

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.112 c
15-1341440157
Германн
2012-07-05 02:15
2013.03.22
Про современные холодильники.


6-1260249129
Dmitriy
2009-12-08 08:12
2013.03.22
Как написать Firewall


2-1334063803
AndreyPl
2012-04-10 17:16
2013.03.22
комбинация клавиш для установки TabOrder


15-1342013393
kki
2012-07-11 17:29
2013.03.22
как будет по англ.


4-1260370228
Megavolt_Old
2009-12-09 17:50
2013.03.22
Чем принципиально отличаются эти два примера кода ...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский