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

Вниз

string и record   Найти похожие ветки 

 
KosilkA ©   (2004-07-20 12:50) [0]

я наверное не первый кто сталкивался с подобной проблемой .. Нужно создать программно типовой файл , для чего я хочу использовать тип record. В файл вносятся как битовые значения так и строковые , длина строки может быть любой , а вся проблема в том что в типе record нужно заранее указывать длину строки..Кака выкрутиться из этой ситуации? Если я обьявлю допустим в типе record строковую переменную s:string[250] , а запишу в неё строчку из 10 букв то остальное пространство из 240 байт будет просто незадействованным , а нужно чтобы оно как бы обрезалось ,чтобы после сроковой переменной можно было сразу писать следующие данные ... в общем , прошу помощи ,ув. мастера, ))


 
clickmaker ©   (2004-07-20 12:52) [1]

SetLength(s)
размер записи расчитывать как SizeOf(TYourRecord) + сумма длин всех строк в ней


 
Суслик ©   (2004-07-20 12:54) [2]

один из вариантов - не пользуйся типизированными файлами.
пользуйся бинарниками - пиши в любом угодном тебе формате - сам разработай и специфийируй.


 
Digitman ©   (2004-07-20 12:57) [3]


> типовой файл


может, все-таки "типизированный файл" ?

файл, имеющий записи переменной длины, считаться типизированным уже не может по определению


 
KosilkA ©   (2004-07-20 18:39) [4]


> Digitman ©   (20.07.04 12:57) [3]

Ну ладно , скажем так:бинарный. =))
Суть вопроса, я полагаю, не меняется , речь идет о record"ах и строках )))
Ладненько ,пойдем иным путем,усем спасибо =))


 
cyborg ©   (2004-07-20 19:29) [5]

длина|строка|длина|строка...


 
Суслик ©   (2004-07-20 19:39) [6]

человек, который разрабатывал проект до меня писал еще круче

длина длины  
длина
строка
....

экономя однако - в основном длинна в 1 б умещалась.


 
Palladin ©   (2004-07-20 19:58) [7]

гдеж тут экономия?


 
Суслик ©   (2004-07-20 20:01) [8]


> Palladin ©   (20.07.04 19:58) [7]
> гдеж тут экономия?


CLASS
FUNCTION TBlob._ReadStr(const aSrc: TStream): String;
VAR
  kInfo: Byte;
  kL: Integer;
BEGIN
  kL := 0;
  ASrc.ReadBuffer(kInfo, SizeOf(kInfo));
  // Нулевая строка
  if kInfo = 0 then kL := 0 else
  // Все укладывается в одном байте
  if (kInfo and $80) = $80 then kL := kInfo and $7F else
  // Короткая строка длиной до 255 байт включительно
  if kInfo = 1 then aSrc.ReadBuffer(kL, SizeOf(Byte))
  // Длинная строка длиной более 255
  else ASrc.ReadBuffer(kL, SizeOf(Integer));
  // Устанавливаем длину
  SetLength(Result, kL);
  // Если длина строки ненулевая, то считываем строку
  if kL > 0 then aSrc.ReadBuffer(Pointer(Result)^, kL);
END;

CLASS
PROCEDURE TBlob._WriteStr(
  const aDst: TStream;
  const aStr: String);
VAR
  kInfo: Byte;
  kL: Integer;
BEGIN
  kL := Length(aStr);
  // Определяем параметры
  if kL = 0 then kInfo := 0 else
  if kL <= $7f then kInfo := $80 or kL else
  if kL <= $ff then kInfo := 1
  else kInfo := 2;
  aDst.WriteBuffer(kInfo, SizeOf(kInfo));
  if kInfo = 1 then aDst.WriteBuffer(kL, SizeOf(Byte)) else
  if kInfo = 2 then aDst.WriteBuffer(kL, SizeOf(Integer));
  if kL > 0 then aDst.WriteBuffer(Pointer(aStr)^, kL);
END;


 
Anatoly Podgoretsky ©   (2004-07-20 21:08) [9]

Суслик ©   (20.07.04 20:01) [8]
Брр!


 
©   (2004-07-21 02:28) [10]

>, а вся проблема в том что в типе record нужно заранее указывать длину строки

Не нужно ничего указывать, просто в типизированнный
файл нельзя писать записи с AnsiString,Variant,Массивы ...
Работа идет с ShortString
S:ShortString;//без всяких указаний(аналог S:String[255])
просто для экономии можно
заранее указать ее длину ест. до 255 Char(если она известна). Проблемма в другом,что строка может быть длиннее 255, и
произойдет ее "обрезание", но этот решается элементарно.


 
Суслик ©   (2004-07-21 10:08) [11]


> Anatoly Podgoretsky ©   (20.07.04 21:08) [9]
> Суслик ©   (20.07.04 20:01) [8]
> Брр!

Возможно.
Писал не я (писано лет 10 назад еще в одной из первой версий дельфи) - работает не первый год, ну и ладно.
Это было к тому, что можно длинну писать не фиксированным значением в 4 байта, а переменным кол-вом байт.

А почему БРР?


 
REA ©   (2004-07-21 10:34) [12]

У вас винчестер маленький или данных много?
Тогда еще можно архивировать на лету.


 
Суслик ©   (2004-07-21 10:38) [13]


> REA ©   (21.07.04 10:34) [12]

второе.

Т.е. вы думаете БРР - это к тому, что незачем экономить место и писать такой непонятный код?

Мне просто казалось, что АП имел в виду ошибки. Я то их не знаю. Вот и хотел узнать.


 
Digitman ©   (2004-07-21 10:56) [14]


> KosilkA


тебе для чего вообще нужен типизированный файл ? для быстрого доступа к отдельным его записям ? и при этом избыточность инф-ции в этом файле тебя сильно заботит ?

есть два нормальных решения задачи, позволяющих хранить записи переменной длины и при этом иметь быстрый доступ к любой из них :

1. Реализовать механизм индексирования записей (в отдельном файле)

2. Отказаться от изобретения очередного велосипеда и воспользоваться одной из современных СУБД (только не DBF-образной), где все это давно уже реализовано и "заточено" под эту задачу


 
KosilkA ©   (2004-07-21 11:58) [15]


> Digitman ©   (21.07.04 10:56) [14]

насчет велосипеда ты прав - но к базам это отношения не имеет , я просто хочу написать свой небольшой модуль для создания файлов lnk , благо спецификация этого файла имеется ...


 
KosilkA ©   (2004-07-21 12:01) [16]

p.s.
хотел использовать для этого record .. воть.


 
Serginio666   (2004-07-21 15:12) [17]

Посмотри http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019

Там есть простенькая иерархическая БД.
Строки лучше хранить в БЛОбах (связных страницах), но в отличие от промышленных БД ты сам можешь настраивать размер страницы (записи). И применять ООП.


 
KosilkA ©   (2004-07-21 15:23) [18]


> Serginio666   (21.07.04 15:12) [17]

хотел посмотреть но как ни странно ..:

> Извините, данная страница не может быть отображена.

Пожалуйста, попробуйте обновить страницу еще раз.

Error: Unable to connect to database

Читал. Долго думал....=)))


 
Serginio666   (2004-07-21 16:19) [19]

Бывает. Просто там где эта страница сайт сменили и работает нестабильно. Сейчас вроде работает.


 
KosilkA ©   (2004-07-22 12:47) [20]

всем спасибо , модуль написал ,правда я пошел сааавсем иным путем =))))


 
Digitman ©   (2004-07-22 12:53) [21]


> KosilkA ©   (22.07.04 12:47) [20]


вообще-то я бы не сказал, что за неимением желания использовать СУБД практика в создании алгоритма индексирования будет излишней

оч полезно и для общего развития и для решения тек.задачи


 
KosilkA ©   (2004-07-22 13:20) [22]


> Digitman ©   (22.07.04 12:53) [21]

ну к этому вопросу я еще когда нибудь вернусь , просто нашелся метод более простой=)



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

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

Наверх




Память: 0.52 MB
Время: 0.04 c
1-1090658388
ИМХО
2004-07-24 12:39
2004.08.08
Немного о TTimer е


3-1088575790
nik
2004-06-30 10:09
2004.08.08
Выделение цветом ячейки в DBGrid


6-1086847094
axx
2004-06-10 09:58
2004.08.08
Вопрос то TServerSocket


3-1089688022
rosl
2004-07-13 07:07
2004.08.08
поиск


14-1090352699
RedLord
2004-07-20 23:44
2004.08.08
инфа по програмированию DirectX