Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Вниз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]
Брр!
← →
R © (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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c