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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2012, 08:02   #1
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию Считывание из файла записи переменной длины

Здравствуйте.

Есть файл, содержащий следующий текст:

12-01-1800:151 721BWMTT B1 0 0 0 0 1 312 1 308 02BWMTT B1 61 0 0 0 0 0 0 0 03BWMTT B1 0 0 0 0 0 0 0 0
12-01-1800:151 721CCS7M2I1 0 0 0 0 02CCS7M2I1 0 0 0 0 0 0 4CCS7M2I1 0 8CCS7M2I1 0 0 1CCS7TTI1 0 900 0 0 0
12-01-1800:151 721BOMTS B1 0 0 0 0 6 284 1 36 02BOMTS B1 30 0 0 0 0 0 0 0 03BOMTS B1 0 0 0 0 0 0 0 4 4BOMTS B1 0 0 0 0 0 0 0 0 5BOMTS B1 0 0 0 0 0 0 8BOMTS B1 0 0 0 0 1BW51 B1 2 32 0 0 2 48 0 0 02BW51 B1 10 0 0 0 0 0 0 0 03BW51 B1 0 0 0 0 0 0 0 2

И есть код, который правильно считывает:
Код:
type
  TTgrp = record
  //постоянная часть
  Date : array[0..7] of Char;
  Time : array[0..4] of Char;
  DQ : array[0..2] of Char;
  VRPL : array[0..2] of Char;
  //переменная часть
  Index: Char;
  TGNO: array[0..5] of Char;
  Opmode: Char;
  Availability: Char;
  Counter1: array[0..6] of Char;
  Counter2: array[0..6] of Char;
  Counter3: array[0..6] of Char;
  Counter4: array[0..6] of Char;
  Counter5: array[0..6] of Char;
  Counter6: array[0..6] of Char;
  Counter7: array[0..6] of Char;
  Counter8: array[0..6] of Char;
  Counter9: array[0..6] of Char;
  end;
Код:
var
f: file;
Tgrp: TTgrp;
begin
if not OpenDialog1.Execute then exit;
AssignFile(f, Opendialog1.FileName);
Reset(f, sizeof(tgrp));
//while not EOF(f) do
//begin
      BlockRead(f, Tgrp,1);
      Edit1.Text:=Tgrp.Date;
      Edit2.Text:=Tgrp.Time;
      Edit3.Text:=Tgrp.DQ;
      Edit4.Text:=Tgrp.VRPL;
//    переменная часть
      Edit5.Text:=Tgrp.Index;
      if Tgrp.Index='1' then 
            begin
            Edit6.Text:=Tgrp.TGNO;
            Edit7.Text:=Tgrp.Opmode;
            Edit8.Text:=Tgrp.Availability;
            Edit9.Text:=Tgrp.Counter1;
            Edit10.Text:=Tgrp.Counter2;
            Edit11.Text:=Tgrp.Counter3;
            Edit12.Text:=Tgrp.Counter4;
            Edit13.Text:=Tgrp.Counter5;
            Edit14.Text:=Tgrp.Counter6;
            Edit15.Text:=Tgrp.Counter7;
            Edit16.Text:=Tgrp.Counter8;
            Edit17.Text:=Tgrp.Counter9;
            end
            .............
CloseFile(f);
end;
Для теста вывожу данные в Edit-ы. Проблема заключается в том, что в файле есть переменная часть. Не могу додуматься, как рассчитать длину переменной части.
royun вне форума Ответить с цитированием
Старый 04.08.2012, 14:45   #2
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Я чего-то видимо недопонимаю. Проблема в том, что строки различной длины?
Цитата:
И есть код, который правильно считывает
Но ведь объявленная структура TTgrp сама по себе фиксированной длины. Значит правильно считывается только начало строки, а Counter1-9 ошибочны.
Насколько понимаю Вашу проблему, по-моему, BlockRead тут никак не поможет, придется читать целиком строку и парсить ее (безумно удобно с помощью explode).
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление записи по номеру и считывание с файла Technical59rus Общие вопросы C/C++ 1 20.06.2012 19:59
Неверное считывание записи из типизированного файла Boris777 Общие вопросы Delphi 3 20.12.2011 02:51
Считывание строки неограниченной длины (Си) 0kopok Помощь студентам 6 05.10.2009 20:46
массивы переменной длины curly182 Паскаль, Turbo Pascal, PascalABC.NET 12 20.05.2009 21:17