Наконец-то взялся за файлы. Много времени прошло, прежде чем я понял как использовать конвертер.
Написал пример для построчного вывода текста файла в журнал. Надеюсь, поможет и остальным тоже.
Код:
PROCEDURE WriteLine (line: ARRAY OF CHAR);
BEGIN
Log.String (line); Log.Ln
END WriteLine;
PROCEDURE Do*;
VAR
f: Files.File;
res: INTEGER;
t: TextModels.Model;
rd: TextModels.Reader;
line: ARRAY 1024 OF CHAR;
BEGIN
res := TestAscii.TextOpen (Files.dir.This("e:/"), "hello.txt", f);
IF f # NIL THEN
t := TestAscii.TextConnectTo (f);
rd := t.NewReader(NIL);
WHILE ~rd.eot DO
TestAscii.ReadLine (rd, line);
WriteLine (line)
END;
TestAscii.TextClose (f)
ELSE
IF res # 0 THEN Error (res) END
END;
END Do;
Код:
MODULE TestAscii;
IMPORT Files, Stores, TextModels, TextViews, HostTextConv;
CONST
LineBreak = 0DX;
PROCEDURE TextOpen* (loc: Files.Locator; name: ARRAY OF CHAR; OUT f: Files.File): INTEGER;
BEGIN
f := Files.dir.Old (loc, name$, Files.shared);
RETURN loc.res
END TextOpen;
PROCEDURE TextClose* (VAR f: Files.File);
BEGIN
f.Close(); f := NIL
END TextClose;
PROCEDURE TextConnectTo* (f: Files.File): TextModels.Model;
VAR store: Stores.Store;
BEGIN
HostTextConv.ImportText (f, store);
RETURN store(TextViews.View).ThisModel()
END TextConnectTo;
PROCEDURE ReadLine* (rd: TextModels.Reader; OUT S: ARRAY OF CHAR);
VAR len: INTEGER; lineend: BOOLEAN;
BEGIN
S[0] := 0X; len := 0; lineend := FALSE;
REPEAT
rd.Read;
IF rd.char # LineBreak THEN
S[len] := rd.char;
INC (len)
ELSE
S[len] := 0X;
lineend := TRUE
END
UNTIL lineend OR rd.eot
END ReadLine;
END TestAscii.
Добавлено:Опосля появилась мысль... Можно сделать по подобию ObxAscii запись со скрытыми полями
f: Files.File
t: TextModels.Model;
rd: TextModels.Reader;
а наружу оставить только процедуры. Кроме того, неплохо бы ещё добавить функциональность записи в файл.