Текущий архив: 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