Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];

Вниз

Чтение файлов   Найти похожие ветки 

 
Duckslayer   (2003-10-07 02:30) [0]

Есть у меня файл, в котором записана некая структура, которую визуально можно представить в виде дерева. Т.е. сначала идет общий заголовок, потом подзаголовки, потом под-подзаголовки и т.д. Количество этих подзаголовков, под-подзаголовков, etc. не указано. Если описывать через record, то наверное придется вложенные рекорды юзать. Но проблема в том, что я не пойму, как читать из файла неопределенное число записей. Может кто знает как это можно реализовать? Может быть можно рассчитать как-то через SizeOf()?


 
SPIRIT   (2003-10-07 03:27) [1]

While not eof(F)


 
Duckslayer   (2003-10-07 03:40) [2]

Хмм.. А можно поконкретнее?
Структура похожа на дерево каталогов. Т.е. в каждом пункте может быть дофига подпунктов. И степень вложенности тоже не ограниченна...
+Dir
| +-SubDir
| | +-Sub-SubDir
| | | +-File
| | | +-File
| | | |...
| | | +-File
| | |
| | +-Sub-SubDir
| | | +-...
| | |
| | +......
| |
| +-SubDir
| | +-Sub-SubDir
| | | +-...
| | +...
| |
| +...
+Dir
+-Subdir...
.....
.......
............

Вот так выглядеть может ;)


 
Германн   (2003-10-07 03:56) [3]

"Неопределенное число записей" через SizeOf расчитать не получится. Но если есть файл, в котором есть "заголовки", "подзаголовки", "подподзаголовки" и т. д., то уж наверное все эти "под-под" "ну хучь чем-то" отличаются друг от друга! От этого следует плясать.


 
pasha_golub   (2003-10-07 10:00) [4]

Надо определиться с типом файла. Он текстовый или нет? Если нет, то какая его структура?

Если текстовый? смотри реализацию TTreeView.Items.LoadFromFile


 
Duckslayer   (2003-10-07 12:55) [5]

Он не текстовый.. Структуру я примерно выше описал. Если посмотреть его в хексе, то перед каждым элементом записана сигнатура элемента (идентификатор) и его длина (по 4 байта каждая).


 
Radionov Alexey   (2003-10-07 13:13) [6]

В Record заведи поле с идентификатором записи и поле с идентификатором предка. По этой информации воссоздашь все древо


 
Serginio1   (2003-10-07 14:35) [7]

Посмотри там есть пример иерархической БД. Может подойдет.
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019


 
Duckslayer   (2003-10-08 14:31) [8]

to Radionov Alexey: А можно поподробнее?
Если ты имел ввиду добавить эти поля в рекорд и потом записывать файл с ними, то это не подойдет, т.к. файл уже есть, а мне его надо вскрыть не меняя структуры.

Я все-таки никак не могу понять, как это можно считать. Ведь если читать рекорды, то это будет последовательное считывание. Он считает например DIR, но как ему потом считать из DIR все его SubDir"ы?


 
icWasya   (2003-10-08 14:35) [9]

то есть файл уже есть? а как он устроен, что туда записано, примерчик ...


 
Duckslayer   (2003-10-08 14:44) [10]

00 A0 00 00 60 20 01 00
00 D0 00 00 08 00 00 00
CB EC CE AC C0 13 00 00

Вот пример в хексе.
00 A0 00 00 - Идентификатор одного большого раздела (по сути самого файла)
60 20 01 00 - Длина этого раздела (совпадает с длиной файла)
00 D0 00 00 - Идентификатор пустого под-раздела. Пустой он потому, что его длина (08 00 00 00) равна всего лишь 8 байтам (в длине учитывается и длина самого "заголовка")
CB EC CE AC - Идентификатор под-раздела.
С0 13 00 00 - Длина этого под-раздела.

получается так (в скобках - длина):
DIR(73824)
+-SubDir(8)
+-SubDir(5056)
....

P.S. Я привел в пример только начало файла, думаю тут все понятно должно быть.

P.S.S. Может кто-нибудь даже узнает, что это за файл? ;)


 
TUser   (2003-10-08 15:01) [11]

Мыш, например, умеет экспортировать/импортировать свои адресные книги в INI файл. Такой файл имеет кучу разделов типа [first\second\...\last]. Можно так организовать.
На DelphiWorld есть база - там хранится инфа о статьях. Число разделов там ограничено, но ничего не мешает сделать его неограниченным. Файл выглядит так
First Node
TABSecond Node
TABTABThird Node
TABTABThird Node
TABTABThird Node
TABTABThird Node
TABSecond Node
TABTABThird Node
TABTABThird Node
TABTABThird Node
TABTABThird Node
TABSecond Node
TABTABThird Node
TABTABThird Node
TABTABThird Node
TABTABThird Node

и т.д.

Читается так

while not eof(F) do begin
read //считать записть
p:=0; while pos(#9,string)=1 do begin
delete(первый символ)
inc (p) end; //считаем количество символов табуляции
if p=0 then rootnode:=AddChild(куда добавить)
if p=1 then child1:=AddChild(rootnode);
if p=2 then child2:=AddChild(child1);
end;

Короче, в результате получется дерево (TStrings, TTreeView) со структурой, описанной в нашем файле.
Можно там и ссылки прописать на какие-то объекты, если требуется.


 
Переяслов Григорий   (2003-10-08 15:54) [12]

Reset(F, 1);
BlockRead(F, Buf, FileSize(F));


 
Duckslayer   (2003-10-08 16:14) [13]

to TUser: Я не пойму, как так можно считывать данные из файла (причем данные разной длины)

to Переяслов Григорий: А дальше как? Через BlockRead я могу прочитать файлы, могу разобрать их по полочкам, однако тогда получится уж очень громоздкий код.
Пример:
while not eof(f) do
begin
Blockread(f,ID_Part,4);
BlockRead(f,szPart,4);
case ID_Part of
40960:
begin
Memo1.Lines.Add("First Section found");
off1:=8;
szdir:=0;
while filepos(f)<szPart do
begin
BlockRead(f,ID_dir,4);
BlockRead(f,szdir,4);
Memo1.Lines.Add("OffSet: "+IntToStr(off1)+#9#9+"ID_dir: "+IntToStr(ID_DIR)+#9#9+"szdir: "+IntToStr(szdir));
case ID_dir of
2899242186:
begin
Memo1.Lines.Add(#9"---Uncoded Script detected---");
assignfile(f2,OpenDialog1.Filename+"_mainscript");
rewrite(f2,1);
Blockwrite(f2,ID_DIR,4);
BlockWrite(f2,szdir,4);
while filepos(f)<(off1+szDir) do
begin
BlockRead(f,tchar,1);
BlockWrite(f2,tchar,1);
end;
Closefile(f2);
end;
2899242187:
........................



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

Форум: "Основная";
Текущий архив: 2003.10.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
3-65328
evgen123
2003-09-30 10:05
2003.10.20
Идентификатор записи


4-65676
Anikul
2003-08-11 22:22
2003.10.20
Как взять текст из ДОС-окна


1-65441
MakNik
2003-10-09 10:53
2003.10.20
была ли ранее выполнена команда AssignFile?


14-65602
pumba
2003-09-27 19:43
2003.10.20
Землетресение


3-65333
Difar
2003-09-30 08:06
2003.10.20
Восстановление таблицы Paradox





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