Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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]
Брр!


 
©   (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
6-1086689533
LeXXX
2004-06-08 14:12
2004.08.08
вопрос по Winsock


14-1090404134
TohaNik
2004-07-21 14:02
2004.08.08
Книги


3-1089697360
Nero
2004-07-13 09:42
2004.08.08
Создание БД


14-1090552599
Думкин
2004-07-23 07:16
2004.08.08
Новосибирск - 5?


6-1086278285
Micah'GF
2004-06-03 19:58
2004.08.08
WinSock: глючит recvfrom





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