Форум: "Начинающим";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
ВнизЗапись структуры в файл Найти похожие ветки
← →
Бергамот (2007-05-22 15:17) [0]Здравствуйте! Такая проблема. Есть струтура, скажем
type
Myclass = record
a,b:char;
c,d:integer;
stext:string
end;
Мне это все нуно записать в файл. Делаю так
var
buffer:myclass;
...
stream:=tfilestem.create(путь,режим);
stream.write(buffer,sizeof(buffer));
sream.free
Пишет, но до stext. А дальше крякозябры.
Если так
stext:array [0..5] of char;
...
buffer.stext:="123456";
Все работает. Но мне нужно чтоб я мог произвольно изменить длину stext. Динамические массивы также идут лесом вместе с string. Разбираю формат одного файла, так там это решено использованием какого-то типа, который перед записью ставит информацию о длине, в размере четырех байт (например A0 00 00 00 <запись длиной в 10 байт>). Что это может быть за тип или как реаллизовать подобное поведение. Мне нужно именно в составе выше означенной структуре.
← →
Сергей М. © (2007-05-22 15:24) [1]
> там это решено использованием какого-то типа, который перед
> записью ставит информацию о длине, в размере четырех байт
Все верно, и тебе нужно именно так поступать.
> Что это может быть за тип
Integer
← →
Desdechado © (2007-05-22 15:32) [2]> Но мне нужно чтоб я мог произвольно изменить длину stext.
Тогда у тебя не типизированный файл получается, а бестиповый. Типизированный требует наличие фиксированной длины типа.
sizeof(buffer) дает длину самой записи, а String - это указатель (те самые 4 байта кракозябр) на место в памяти.
← →
Бергамот (2007-05-22 15:35) [3]Все верно, и тебе нужно именно так поступать.
> Что это может быть за тип
Integer
Это я и так понял. Можно ввести подструктуру.
Например
type
Tpodst = record
size:integer;
text://незнаю что, например статистический массив char
end;
Но остается проблема с произвольной длиной записи.
← →
Бергамот (2007-05-22 15:38) [4]sizeof(buffer) дает длину самой записи, а String - это указатель (те самые 4 байта кракозябр) на место в памяти.
Тоже понятно, как и pchar. Суть проблемы описал в [2]. Как можно решить?
← →
Сергей М. © (2007-05-22 15:43) [5]
> Как можно решить?
При требованиях к типизированности файла - никак.
Или отказывайся от типизированности или фикируй длину строки. Третьего не дано.
← →
Бергамот (2007-05-22 15:46) [6]Тогда у тебя не типизированный файл получается, а бестиповый. Типизированный требует наличие фиксированной длины типа.
То-то и оно в том файле явно просматривается типизированый тип, но какимто образом сделана изменяемая длина записи. Можно было бы заранее определить запредельный размер этой записи (так на все случаи жизни), но тады бы оставались нули, если содержимое меньше, а их там нет.
← →
Бергамот (2007-05-22 15:49) [7]Или отказывайся от типизированности или фикируй длину строки. Третьего не дано.
А через динамические массивы, как-нибуть может пролезть?
← →
Правильный Вася (2007-05-22 15:50) [8]
> через динамические массивы
массивы чего?
← →
umbra © (2007-05-22 15:55) [9]
> какимто образом сделана изменяемая длина записи.
можно, например, писать перед каждой записью ее размер, далее саму запись. И читать потом, соответственно, сначала размер, потом саму запись.
← →
Плохиш © (2007-05-22 15:56) [10]
> Бергамот (22.05.07 15:46) [6]
> То-то и оно в том файле явно просматривается типизированый тип,
Глупость. Файл это последовательный набор байтов, а интерпретация этого набора целиком лежит на совести воспалённого мозга программиста. Если ты запишешь все поля своей записи поочереди в файл, а строку в виде <длина><данные>, то у тебя будет "явно просматривается типизированый тип"
← →
Бергамот (2007-05-22 16:01) [11]Глупость. Файл это последовательный набор байтов, а интерпретация этого набора целиком лежит на совести воспалённого мозга программиста. Если ты запишешь все поля своей записи поочереди в файл, а строку в виде <длина><данные>, то у тебя будет "явно просматривается типизированый тип"
:0)
Ладно всем спасибо. Схитрить хотел. Повидимому придется побайтно разбирать.
← →
Amoeba © (2007-05-22 16:09) [12]
> Повидимому придется побайтно разбирать.
Флаг в руки и барабан на шею! Если не хочешь отказаться от типизированного файла и последовать umbra © (22.05.07 15:55) [9], или же вместо длинной строки в записи использовать короткую.
← →
Плохиш © (2007-05-22 16:46) [13]
> Amoeba © (22.05.07 16:09) [12]
> последовать umbra © (22.05.07 15:55) [9]
И как это позволит записать записи с полями типа длиной строки или динамического массива?
Всё-равно эти поля придётся отдельно писать...
← →
Amoeba © (2007-05-22 17:04) [14]
> И как это позволит записать записи с полями типа длиной
> строки или динамического массива?
> Всё-равно эти поля придётся отдельно писать...
>
Это и имелось в виду, что строковые поля записывать отдельно, после всех нестроковых.
← →
Сергей М. © (2007-05-22 17:11) [15]
> Бергамот (22.05.07 16:01) [11]
> Повидимому придется побайтно разбирать
Если не требуется рандомный доступ к элементам массива "структур", хранящихся в файле, то изобретать велосипед вовсе не требуется.
Достаточно использовать вместо структуры класс-наследник TComponent, Борланд "научил" этот класс автоматически сохранять свои опубликованные св-ва (в т.ч. String) в стрим для последующего автоматическтго восстановления.
см. TStream.WriteComponent[Res]
← →
Бергамот (2007-05-22 19:32) [16]
> Amoeba © (22.05.07 16:09) [12]
> Если не хочешь отказаться от типизированного файла и последовать
> umbra © (22.05.07 15:55) [9]
>
> Бергамот (22.05.07 16:01) [11]
Собственно так я и собирался поступить, так и было сделано, пока все исходники вместе с виндой не грохнул
← →
Anatoly Podgoretsky © (2007-05-22 19:34) [17]> Бергамот (22.05.2007 19:32:16) [16]
Бог с ней с виндой, но хоть бы исходники оставил.
← →
Бергамот (2007-05-22 19:39) [18]
> но хоть бы исходники оставил
Забыл, что по умолчанию они на диске "С" живут ))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c