Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Быстрое чтение файла   Найти похожие ветки 

 
Кастуся   (2004-06-27 09:32) [80]

Снова чуть-чуть продолжим

> Romkin ©   (25.06.04 16:36) [78]

Если считывать файл побайтно, возникает проблема с определением положения троки идентификатора. Вот задача:
в общем случае есть в тексте сообщение вида:
MESSAGE: ## ## ##  ## ## ##;
Необходимо его идентифицировать и получить, то что находится вместо #. Вот. как это реализ с пом-ю конечн автомата?


 
Кастуся   (2004-06-27 09:55) [81]


> Romkin ©   (25.06.04 16:36) [78]

вся штука в том, как в этом непрерывном потоке найти идентификационную строку?
или ты предлагаешь считывать строки методом
while not eof(f) do
begin
 readln(f,st);
 if pos("MESSAGE",st)>0 then
  использовать конечный автомат
end;
так?


 
Anatoly Podgoretsky ©   (2004-06-27 11:56) [82]

Поток длеко не непрерывный, а разбит на строки.


 
Romkin ©   (2004-06-28 11:23) [83]

Кастуся  (27.06.04 09:32) [80] Не все так просто :))
Надо полностью определить правила. Лучше бы реальный пример привел, на первый взгляд, твой случай решается детерминированным автоматом, а то, что ты с message привел - недетерминированным удобнее ;)
Впрочем, эскиз набросать могу. Итак, есть текстовый файл, процедура должна заполнить TStrings частями строк, идущими после "MESSAGE:" и до конца строки, удалив пробелы. Символы между идентификатором и концом строки - любые.
Так пойдет? :)) Сейчас будет...


 
Romkin ©   (2004-06-28 12:11) [84]

Вот, пожалуйста. Разбирайся, должно работать.
Понятно, Lines должны быть созданы до вызова процедуры...

type
 TAutoState = (auWaitIdent, auInIdent, auReadMsg);

const
 Ident: string = "MESSAGE:";
 EndStrChars: set of char = [ #13,#10];
 ExceptChars: set of char = [" "]; //Строка без этих символов

procedure GetMsgStrings(const FileName: string; Lines: TStrings);
var
 F: file of char;
 auState: TAutoState;
 IdLen: Integer;
 IdPos: Integer;
 ch: char;
 MsgStr: string;
begin
 idLen := Length(Ident);
 MsgStr := "";
 assignFile(F, FileName);
 reset(F);
 try
   auState := auWaitIdent;
   while not EOF(F) do
   begin
     Read(F, ch);
     case auState of
       auWaitIdent: begin //Ждем "MESSAGE:"
         if ch = Ident[1] then //первый символ, однако
         begin
           idPos := 1;
           auState := auInIdent;
           //На тот случай, если длина Ident = 1
           if idPos = idLen then  //Ident найден
             auState := auReadMsg;
         end;
       end;
       auInIdent: begin //Проверяем, однако, совпадение
         Inc(idPos);
         if (ch = Ident[idPos]) and (idPos = idLen) then
           auState := auReadMsg
         else
           if ch <> Ident[idPos] then //Это не ident
             auState := auWaitIdent;

         //увы, только одно состояние :(
         //На случай попадания MESMESSAGE: и тд
         if (ch = Ident[1]) and (auState <> auInIdent) then
         begin
           idPos := 1;
           auState := auInIdent;
         end;
       end;
       auReadMsg: begin
         if not (ch in EndStrChars) then //Конца строки нет
         begin
           if not (ch in ExceptChars) then //все, кроме пробела
             MsgStr := MsgStr + ch;
         end
         else
         begin
           auState := auWaitIdent;
           Lines.Add(MsgStr);
           MsgStr := "";
         end
       end;
     end; //case
   end; //while
 finally
   CloseFile(F);
 end;
end;



Страницы: 1 2 3 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.049 c
3-1086856718
JPG
2004-06-10 12:38
2004.07.11
Запись рисунка jpg в Access базу


4-1086119005
GROL
2004-06-01 23:43
2004.07.11
Позиции символа в шрифте


4-1086067514
TRyaSS
2004-06-01 09:25
2004.07.11
как посылать импульсы определенной длины на DTR и RTS


14-1087561676
empleado
2004-06-18 16:27
2004.07.11
Friday


3-1087372749
vr!
2004-06-16 11:59
2004.07.11
Проблема с открытием большого DBF файла тз Делфи