|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Чтение файла по структуре
Проблема: есть файл, известна его структура в таком виде
Код:
<data type="int" name="ID" format="signed" len="4" display=""/> <data type="int" name="" format="signed" len="4" display=""/> <data type="int" name="" format="signed" len="4" display=""/> <data type="int" name="Count_Points" format="signed" len="4" display=""/> <for name="Point" count="Count_Points" stop_test="" type_name="" comment=""> <struct name="point" type_name="" comment="" expr=""> <data type="real" name="X" format="ieee" len="4" display=""/> <data type="real" name="Altitude" format="ieee" len="4" display=""/> <data type="real" name="Z" format="ieee" len="4" display=""/> <data type="real" name="Direction_X" format="ieee" len="4" display=""/> <data type="real" name="Direction_Altitude" format="ieee" len="4" display=""/> <data type="real" name="Direction_Z" format="ieee" len="4" display=""/></struct> </for><data type="int" name="Count_Segments" format="signed" len="4" display=""/> тоесть указаны типы данных и их тип нужно считать в динамические массивы(количество элементов массива соответствует количеству элементов в файле) что то с ними сделать(отредактировать файл) и сохранить обратно как это сделать? Заранее спасибо структура файла задается в коде, поиск использовал(гугл тоже) но ничего подходящего под данную задачу не нашел, надеюсь на вашу помощь |
#2
|
||||
|
||||
Судя по внешнему виду у вас вариант XML-файла. То что вы показали, просто описатель данных. Считать этот описатель я думаю можно с помощью TXMLDocument.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
видимо я нечетко обьяснил
структуру парсить ненужно, она не динамическая и поэтому задаются все параметры массивов программно, но как загрузить данные в массивы - я незнаю структура дает имя элемента, длинну блока, тип и т.д., нужно описать массивы по этим данным, загрузить в них данные, раскидать данные по компонентам, сохранить инфу обратно в файл блокрид внятных примеров не имеет, по крайней мере в гугле, так что прошу помощи у вас |
#4
|
||||
|
||||
Если я правильно понял, то данные у вас идут непрерывным блоком в отдельном файле. Вот считать их и проблема?
Делается это, вы правильно поняли, через BlockRead или можно использовать специальный класс TFileStream. В любом случае будет примерно так: Читаем первые 16 байт из файла. Если нам нужен далее идентификатор записи, то читаем сначала в него 4 байта, а потом пропускам 8 байт (они не несут инфы). Далее читаем 4 байта - это у нас уже буде количество точек (структура точек у вас жестко задана поэтому под нее можно сформировать Record общей длиной 24 байта). Считываете блоки данных по 24 байта столько раз, сколько задано точек ранее. Далее вы повторяете весь блок операций снова. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 19.09.2011 в 16:44. |
#5
|
|||
|
|||
скорее всего это сработает, но не могли бы помочь с листингом?
особенно потока) |
#6
|
||||
|
||||
Вы точно дали все описание? Меня смущает вот эта строчка:
</for><data type="int" name="Count_Segments" format="signed" len="4" display=""/> Предполагается что ранее должен быть где-то задан Count_Segments, а я его в описании не вижу. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
|||
|
|||
Код:
<?xml version="1.0"?> <!DOCTYPE binary_file_format SYSTEM "BinaryFileFormat.dtd"> <binary_file_format name="PATH" type_name="" comment="" expr=""> <data type="int" name="Version" format="signed" len="4" display=""/> <data type="int" name="Count" format="signed" len="4" display=""/> <for name="Path" count="Count" stop_test="" type_name="" comment=""> <struct name="path" type_name="" comment="" expr=""> <data type="int" name="" format="signed" len="4" display=""/> <data type="int" name="ID" format="signed" len="4" display=""/> <data type="int" name="" format="signed" len="4" display=""/> <data type="int" name="" format="signed" len="4" display=""/> <data type="int" name="Count_Points" format="signed" len="4" display=""/> <for name="Point" count="Count_Points" stop_test="" type_name="" comment=""> <struct name="point" type_name="" comment="" expr=""> <data type="real" name="X" format="ieee" len="4" display=""/> <data type="real" name="Altitude" format="ieee" len="4" display=""/> <data type="real" name="Z" format="ieee" len="4" display=""/> <data type="real" name="Direction_X" format="ieee" len="4" display=""/> <data type="real" name="Direction_Altitude" format="ieee" len="4" display=""/> <data type="real" name="Direction_Z" format="ieee" len="4" display=""/></struct> </for><data type="int" name="Count_Segments" format="signed" len="4" display=""/> <for name="Segments" count="Count_Segments" stop_test="" type_name="" comment=""> <struct name="segment" type_name="" comment="" expr=""><data type="real" name="Waypoint_1_X" format="ieee" len="4" display=""/><data type="real" name="Waypoint_1_Altitude" format="ieee" len="4" display=""/><data type="real" name="Waypoint_1_Z" format="ieee" len="4" display=""/><data type="real" name="Waypoint_2_X" format="ieee" len="4" display=""/><data type="real" name="Waypoint_2_Altitude" format="ieee" len="4" display=""/><data type="real" name="Waypoint_2_Z" format="ieee" len="4" display=""/><data type="int" name="Start_Point" format="signed" len="4" display=""/><data type="int" name="End_Point" format="signed" len="4" display=""/><data type="real" name="Segment_Length" format="ieee" len="4" display=""/></struct></for></struct></for></binary_file_format> структура для hexeditfree |
#8
|
|||
|
|||
Все данные из структуры забиваются непосредственно в код, парсить не нужно
|
#9
|
|||
|
|||
ап, очень нужна помощь
|
#10
|
|||
|
|||
А есть хоть какой нибудь код?
|
#11
|
|||
|
|||
Ну, в принципе, по данному xml можно сваять кекоторый читатель-писатель файла. Фактически у нас есть некоторый набор структур:
Код:
type TData_Point = packed record X : Single; Altitude : Single; Z : Single; Direction_X : Single; Direction_Altitude : Single; Direction_Z : Single; end; TData_Segment = packed record Waypoint_1_X : Single; Waypoint_1_Altitude : Single; Waypoint_1_Z : Single; Waypoint_2_X : Single; Waypoint_2_Altitude : Single; Waypoint_2_Z : Single; Start_Point : Integer; End_Point : Integer; Segment_Length : Single; end; TData_Path = packed record Stub1 : Integer; ID : Integer; Stub2 : Integer; Stub3 : Integer; Count_Points : Integer; Point : Array Of TData_Point; Count_Segments : Integer; Segment : Array Of TData_Segment; end; TData_File = packed record Version : Integer; Count : Integer; Path : Array Of TData_Path; end; Как-то так. Хотя может имеет смысл сделать их классами с соотв. методами чтения/записи. |
#12
|
|||
|
|||
Это обьявление переменных(да и это должны быть массивы, т.к. данных очень много. файл по сути база, в которой разными типами и разными блоками записана информация), а как считать и записать файл? блокриды, блокврайты или файл стримы? желательно с примерами, 1 раз делаю подобное
|
#13
|
||||
|
||||
С этого:
Код:
ype="int" name="Count_Segments" format="signed" len="4" display=""/> Count_Segments signed 4 ? |
#14
|
|||
|
|||
Да нет же, считывать ничего не нужно из структуры, она статическая и задается программно. нужно считать из файла информацию(и записать измененную) по данным из структуры
|
#15
|
||||
|
||||
Цитата:
Что есть, и что нужно: 1. 2. 3. .... Что именно находится в файле. В каком формате. И т.д. |