Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.09.2011, 12:44
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
Восклицание Чтение файла по структуре

Проблема: есть файл, известна его структура в таком виде
Код:
<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  
Старый 19.09.2011, 15:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Судя по внешнему виду у вас вариант XML-файла. То что вы показали, просто описатель данных. Считать этот описатель я думаю можно с помощью TXMLDocument.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 19.09.2011, 15:37
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

видимо я нечетко обьяснил
структуру парсить ненужно, она не динамическая и поэтому задаются все параметры массивов программно, но как загрузить данные в массивы - я незнаю
структура дает имя элемента, длинну блока, тип и т.д., нужно описать массивы по этим данным, загрузить в них данные, раскидать данные по компонентам, сохранить инфу обратно в файл
блокрид внятных примеров не имеет, по крайней мере в гугле, так что прошу помощи у вас
Ответить с цитированием
  #4  
Старый 19.09.2011, 16:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если я правильно понял, то данные у вас идут непрерывным блоком в отдельном файле. Вот считать их и проблема?
Делается это, вы правильно поняли, через BlockRead или можно использовать специальный класс TFileStream.
В любом случае будет примерно так:
Читаем первые 16 байт из файла. Если нам нужен далее идентификатор записи, то читаем сначала в него 4 байта, а потом пропускам 8 байт (они не несут инфы). Далее читаем 4 байта - это у нас уже буде количество точек (структура точек у вас жестко задана поэтому под нее можно сформировать Record общей длиной 24 байта). Считываете блоки данных по 24 байта столько раз, сколько задано точек ранее. Далее вы повторяете весь блок операций снова.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 19.09.2011 в 16:44.
Ответить с цитированием
  #5  
Старый 19.09.2011, 16:56
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

скорее всего это сработает, но не могли бы помочь с листингом?
особенно потока)
Ответить с цитированием
  #6  
Старый 19.09.2011, 17:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вы точно дали все описание? Меня смущает вот эта строчка:
</for><data type="int" name="Count_Segments" format="signed" len="4" display=""/>
Предполагается что ранее должен быть где-то задан Count_Segments, а я его в описании не вижу.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 19.09.2011, 17:35
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

Код:
<?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  
Старый 20.09.2011, 12:00
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

Все данные из структуры забиваются непосредственно в код, парсить не нужно
Ответить с цитированием
  #9  
Старый 22.09.2011, 05:37
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

ап, очень нужна помощь
Ответить с цитированием
  #10  
Старый 22.09.2011, 06:03
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

А есть хоть какой нибудь код?
Ответить с цитированием
  #11  
Старый 22.09.2011, 07:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,025
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в принципе, по данному 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  
Старый 22.09.2011, 13:35
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

Это обьявление переменных(да и это должны быть массивы, т.к. данных очень много. файл по сути база, в которой разными типами и разными блоками записана информация), а как считать и записать файл? блокриды, блокврайты или файл стримы? желательно с примерами, 1 раз делаю подобное
Ответить с цитированием
  #13  
Старый 22.09.2011, 13:39
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

С этого:
Код:
ype="int" name="Count_Segments" format="signed" len="4" display=""/>
Тебе нужно считать:
Count_Segments signed 4

?
Ответить с цитированием
  #14  
Старый 22.09.2011, 18:48
Darkstarko Darkstarko вне форума
Прохожий
 
Регистрация: 19.09.2011
Сообщения: 12
Репутация: -3458
По умолчанию

Да нет же, считывать ничего не нужно из структуры, она статическая и задается программно. нужно считать из файла информацию(и записать измененную) по данным из структуры
Ответить с цитированием
  #15  
Старый 22.09.2011, 18:58
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от Darkstarko
Да нет же, считывать ничего не нужно из структуры, она статическая и задается программно. нужно считать из файла информацию(и записать измененную) по данным из структуры
Так-с... тогда пример в студию.
Что есть, и что нужно:
1.
2.
3.
....

Что именно находится в файле.
В каком формате.
И т.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter