Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2010, 19:59   #1
Ryazanec
 
Регистрация: 24.10.2010
Сообщений: 4
По умолчанию Чтение типизированого бинарного файла (ILDA)

здравствуйте, Возникла проблемма в дельфи при чтении бинарного файла.
Что за глюк? немогу прочитать правильно бинарник - с другими никогда проблемм не возникало.


Бинарник структкрированый, но не хочет читаться правильно.

Файл формата ILDA (пдф ку с описанием прилагаю).

Файл состоит из блока заголовков и блока данных, данные читаются хорошо, а вот заголовки всё время неправильно,

пробовал несколькими способами результат один.

из этого файла мне нужно прочитать к примеру 3D координаты - (формат код 0,0,0,0 по описанию)

я создаю новый тип

Код:
type Tzagolovok = record
  ILDA_ident : String[4];
  FormatCode  : string[4] ;

{тут может быть и
FormatCodea  : byte ;
FormatCodeb  : byte ;
FormatCodec  : byte ;
FormatCode  : byte ;  
и другие комбинации результат один - неверно проочитанный заголовок}

  FrameName : String[8];
  CompanyName : String[8];
  PointsNumber : Word  ;
  FrameNumber : Word  ;
  TotalFrames : Word  ;
  ScannerHead : Byte;
  Future : Byte;
а дальше читаю или так:

Код:
Stream := TFileStream.Create(open.FileName, fmOpenRead);
Stream.ReadBuffer(zag, SizeOf(Tzagolovok));
или так

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  f: file of Tzagolovok ;
  open : Topendialog;
  pec : Tzagolovok;
begin
  memo1.Clear;
  open := TOpenDialog.Create(self);
  open.InitialDir := 'C:\000';
  open.Options := [ofFileMustExist];
  open.Filter :=  'Ilda files|*.ild';
  open.Execute;
  AssignFile(f,open.FileName);
  {$I-}
  Reset(f);
  {$I+}
  seek(f,0);
  Read(f,pec);
  memo1.Lines.Add(pec.ILDA_ident);
  memo1.Lines.Add(inttostr(pec.FormatCodea)+' формат код');
  memo1.Lines.Add(inttostr(pec.FormatCodeb)+' формат код');
  memo1.Lines.Add(inttostr(pec.FormatCodec)+' формат код');
  memo1.Lines.Add(inttostr(pec.FormatCode)+' формат код');
  memo1.Lines.Add(pec.FrameName+' имя фрейма');
  memo1.Lines.Add(pec.CompanyName+' Название компании');
  memo1.Lines.Add(inttostr(pec.PointsNumber)+' номер точки');
  memo1.Lines.Add(inttostr(pec.FrameNumber)+' номер фрейма');
  memo1.Lines.Add(inttostr(pec.TotalFrames)+' всего фреймов');
  memo1.Lines.Add(inttostr(pec.ScannerHead)+' Сканирующая голова');
  memo1.Lines.Add(inttostr(pec.Future)+' футура');
  CloseFile(f);
end;

результат такой:
LDA
0
256
0
56473
1
244



А должен быть (смотрел в hex редакторе) (прилагаю тестовый файл).

ILDA
0 формат код
0 формат код
0 формат код
0 формат код
Fr00000 имя фрейма
Название компании
548-Количество точек
1-номер кадра
1- количество кадров
0- Сканирующая голова
0-футура

тоесть дельфи отказывается читать этот файл как структурированый.
Приходится читать по 1 байту за раз анализировать и так делее в итоге код типа (сильно не смеяться я с этой

проблеммой неделю вожусь уже)


Код:
while not Eof(f) do
  begin
  Inc(i);
    BlockRead(f,c,1);
    // ищем заголовок
    if Chr(c)='I' then s:=chr(c);
    if Chr(c)='L' then s:=s+chr(c);
    if Chr(c)='D' then s:=s+chr(c);
    if Chr(c)='A' then s:=s+chr(c);
    if s='ILDA' then
      begin
        j:=4;
        form1.memo1.Lines.Add(s);
        s:='';
      //  n:=i-4;
        Continue;
      end;
      inc(j);

///// Чтоение формат кода
      if (j> 4) and (j<= 8) then
       begin
         form1.memo1.Lines.Add(inttostr(c));
         if (j=8)and(c=0)and(n=0) then
         begin
          n:=i-7;
          form1.memo1.Lines.Add(inttostr(n)+' - номер начала')
         end;

       end;
// Чтение имени фрейма
       if (j>8) and (j<= 16) then
       begin
       s := s+chr(c);
       if j = 16 then begin
         form1.memo1.Lines.Add(s+'-имя фрейма');
         S:='';
       end;
       end;
//////////// и так далее
но что бы прочитать файл 1-2 мегобайта размером нужно ждать... кажется что программа зависла.


зато координаты читаются отлично.
вот пример:

Код:
Type
TCOORDINATE = record
X : Smallint;
Y : Smallint;
Z : Smallint;
Blanking : Byte ;
Color : Byte;
End;
Coordinat = file of TCOORDINATE;
 for I := 0 to kol do
       begin
        Read(fil,pec);
 {расбираю координаты }
 end;


читать побитно не выход, помогите прочитать этот файл.
Хотя бы заголовки.
Вложения
Тип файла: rar IDTF05-finaldraft.rar (54.1 Кб, 18 просмотров)
Тип файла: rar test.rar (1.2 Кб, 11 просмотров)
Ryazanec вне форума Ответить с цитированием
Старый 24.10.2010, 20:53   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
type Tzagolovok = {packed} record //попробуйте без него, не выйдет то скобки убрать
  ILDA_ident : array[1..4] of ANSIChar;
  FormatCode  : array[1..4] of byte;
  FrameName : array[1..8] of ANSIChar;
  CompanyName : array[1..8] of ANSIChar;
  PointsNumber : Word  ;
  FrameNumber : Word  ;
  TotalFrames : Word  ;
  ScannerHead : Byte;
  Future : Byte;
попробуйте так, со string аккуратнее, это всетаки класс(особый, но всетаки класс), а не банальный тип.

и кстати, а побитно это как?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.10.2010, 21:04   #3
Ryazanec
 
Регистрация: 24.10.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
и кстати, а побитно это как?
Извините - опечатка - по 1 байту.

packed record пробовал
всеравно не попадает, да и проблемма только именно со string так как остальные данные вроде как более менее читаются.
Ryazanec вне форума Ответить с цитированием
Старый 24.10.2010, 21:05   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы посмотрели что я изменил не только packed?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.10.2010, 21:10   #5
Ryazanec
 
Регистрация: 24.10.2010
Сообщений: 4
По умолчанию

Спасибо Помогло.
ILDA_ident : array[1..4] of ANSIChar; - я делал просто char с этим не работало.

Я отвечал когда - еще ваш пример не пробовал еще, ответил только за то что пробовал.
Ryazanec вне форума Ответить с цитированием
Старый 24.10.2010, 21:12   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

АНСИ символ и ЮНИКОД символ, это разные вещи

кстати можете попробывать ANSIstring[4] поставить, может сработать(string удобнее порой)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.10.2010, 21:16   #7
Ryazanec
 
Регистрация: 24.10.2010
Сообщений: 4
По умолчанию

Со стринг не получается, он не полностью строку читает, ANSIstring пробовал давно еще - там вообще ошибка вылетает при чтении.
Ryazanec вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить строку из типизированого файла Delphi prod87 Помощь студентам 4 03.07.2010 09:09
Windows-service.Некорректное чтение бинарного файла. Ifmomax Общие вопросы Delphi 0 02.07.2010 16:47
Чтение из бинарного файла. kir_rik Помощь студентам 2 04.06.2010 00:31
Удаление из типизированого файла SnowSin Помощь студентам 1 06.12.2009 16:08
Запись/чтение из бинарного файла - непонятные проблемы.... Jorgen Общие вопросы C/C++ 1 26.11.2009 11:45