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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2013, 13:31   #1
Геннадий
 
Регистрация: 01.11.2006
Сообщений: 4
По умолчанию Считать бинарный файл в массив

Имеется бинарный файл. В нём между маркерами заключены блоки информации. Блок это 16строк из 12слов, каждое слово 4байта. Маркер находится в первых двух словах блока (FFFFFFFF FF). Мне необходимо считать информацию в 2-х мерный динамический массив размером 4*12=48байт Х сколько получится строк. Вся проблема в том, что информация в блоке может быть частично сбойной и все 4*12*16=768 байт блока могут и не прописаться. Поэтому надо не прописанную информацию забить нулями до конца блока. Начинаю делать так, на правильность действий не претендую.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  //Маркер
  Marker = #$FF#$FF#$FF#$FF#$FF#$FF;
var
  Od: TOpenDialog;
  f: file; //файловая переменная
  StrBuff: AnsiString; //Строковый буфер в который загрузим данные из файла
  fCount: Integer; //количество байт
  fPos: Integer; //позиция маркера
  StrRes: AnsiString; //результирующая строка кадра
  ArrPosMar: array of Integer; //д. массив значений позиций маркеров
  LenArrPosMar: integer; //длина д.массива значений позиций маркеров
  ArrStrRes: array of array of string; //2-х мерный д.массив строка кадра
  LenArrStrRes: integer; //длина 2-х мерного д.массив строка кадра
begin

  Od := OpenDialog1;
  if not Od.Execute then
    Exit;
  AssignFile(f, Od.FileName);
  Reset(f, 1);
  SetLength(StrBuff, FileSize(f));
  fCount := FileSize(f);
  BlockRead(f, PChar(StrBuff)^, fCount);
  //закрываем файл.
  CloseFile(f);
  //ищем первый маркер
  fPos := PosEx(Marker, StrBuff, 1);
  //если первый маркер не найден - выходим.
  if fPos = 0 then
  begin
    ShowMessage('Маркер не найден. Действие отменено.');
    Exit;
  end
  else
  begin
    //заводим динамический массив позиций маркеров
    LenArrPosMar := 1;
    SetLength(ArrPosMar, LenArrPosMar);
    ArrPosMar[0] := fPos;
    while fPos <> 0 do
    begin
      fPos := PosEx(Marker, StrBuff, fPos + Length(Marker));
      if fPos <> 0 then
      begin
        inc(LenArrPosMar);
        SetLength(ArrPosMar, LenArrPosMar);
        ArrPosMar[LenArrPosMar - 1] := fPos;
      end;
    end;
    if fPos = 0 then
      ShowMessage('Все маркеры найдены. ');
  end;
И вот теперь мне нужно, пройдя циклом по длине массива маркеров
for i := 0 to LenArrPosMar - 2 do
begin
StrRes := Copy(StrBuff, ArrPosMar[i], ArrPosMar[i + 1] - ArrPosMar[i]);
Сложить результирующие строки в двумерный динамический массив. Помогите с кодом.

Последний раз редактировалось Stilet; 20.11.2013 в 14:23.
Геннадий вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переписать массив структур в бинарный файл (С++) Itess Помощь студентам 0 02.06.2013 20:54
не получается считать файл в массив fate Общие вопросы Delphi 3 01.10.2011 21:23
Бинарный файл Хитман Помощь студентам 1 27.03.2011 19:04
Бинарный файл mchip Microsoft Office Excel 10 05.03.2009 19:10
Бинарный файл Bayazet Общие вопросы Delphi 1 04.03.2009 16:39