OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 05:43

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Вторник, 09 Февраль, 2010 17:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Найти нужный конвертер в списке зарегистрированных Converters.list (регистрация стандартных в Config.Setup). Если этот конвертер импортирует "TextViews.View", то
Код:
v := Views.Old(Views.dontAsk, loc, name, conv);
text := v(TextViews.View).ThisModel()
или
Код:
Converters.Import(loc, name, conv, store);
text := store(TextViews.View).ThisModel()

Можно тупо вызвать процедуру импорта конкретного конвертера. Например, в статически собранном консольном компиляторе.
Код:
f := Files.dir.Old(...);
HostTextConv.ImportDosText(f, store)

Пример конвертера ObxConv.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Вторник, 16 Февраль, 2010 17:10 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Наконец-то взялся за файлы. Много времени прошло, прежде чем я понял как использовать конвертер.

Написал пример для построчного вывода текста файла в журнал. Надеюсь, поможет и остальным тоже.
Код:
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;
а наружу оставить только процедуры. Кроме того, неплохо бы ещё добавить функциональность записи в файл.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Вторник, 16 Февраль, 2010 18:39 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Только зачем отдельный WriteLine.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Четверг, 18 Февраль, 2010 16:44 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Написал модуль, упрощающий работу с текстовыми файлами (чтение и запись). Не нашёл более подходящего названия, как TestAsciiFile.
Пытался привести внешние (клиентские) операции над файлами к привычным, наподобие: Открыть-Прочесть-Закрыть, придерживаясь блэкбоксовской модели работы с файлами.
По сути, файлы не обязательно должны быть ASCII, ибо при наличии соответствующего конвертера можно прочесть (почти) любой файл.
Имеется пример использования. На ваш суд.

Вложение:
AsciiFile.zip [2.96 КБ]
Скачиваний: 387


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Вторник, 17 Август, 2010 15:50 

Зарегистрирован: Среда, 27 Май, 2009 17:33
Сообщения: 27
Добрый день, столкнулся с небольшой проблемой.

Код:
PROCEDURE StringToSString(IN str: ARRAY OF CHAR; OUT sstr: ARRAY OF SHORTCHAR);
   VAR
      i : INTEGER;
   BEGIN
      i := 0;
      WHILE str[i] # 0X DO
         sstr[i] := SHORT(str[i]);
         INC(i);
      END;
      sstr[i] := SHORT(str[i]);      
END StringToSString;

...

w: Stores.Writer;
res, i, j: INTEGER;
s : Dialog.String;
ss : ARRAY 255 OF SHORTCHAR;
...
StringToSString(s,ss);
w.WriteSString(ss);
...

В результате получаю что каждая ss записанная в файл оканчивается на символ �.
Вот скрин результата.
Вложение:
Снимок.JPG
Снимок.JPG [ 17.24 КБ | Просмотров: 6522 ]


Я не правильно конвертирую типы CHAR->SHORTCHAR?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Вторник, 17 Август, 2010 16:53 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Stores.WriteSString пишет строки с завершающим 0X. Для текстового файла не приемлемо...

1) Какая версия ББ?
2) Какая задача?

Если бы мне требовалось формирование текстового файла, то писал бы в ББ-й текст, который бы штатно выгрузил конвертером. Для особых случаев правильнее реализовать соотв. конвертер, нежели делать прямую выгрузку в файл.
Код:
 (* пример *)
   PROCEDURE WriteTextFile*;
      VAR
         text: TextModels.Model; fmt: TextMappers.Formatter;
         loc: Files.Locator; conv: Converters.Converter;
         i: INTEGER;
   BEGIN
      text := TextModels.dir.New(); fmt.ConnectTo(text);
      fmt.WriteString("x"); fmt.WriteTab; fmt.WriteString("sqrt(x)"); fmt.WriteLn;
      i := 0;
      WHILE i <= 10 DO
         fmt.WriteInt(i); fmt.WriteTab;
         fmt.WriteReal(Math.Sqrt(i)); fmt.WriteLn;
         INC(i)
      END;
      conv := Converters.list;
      WHILE (conv # NIL) & ~(conv.exp = "HostTextConv.ExportText") DO
         conv := conv.next
      END;
      ASSERT(conv # NIL, 100); (* вместо обр. ошибки АВОСТ *)
      loc := Files.dir.This("");
      Converters.Export(loc, "abc.txt", conv, TextViews.dir.New(text));
      ASSERT(loc.res = 0, 101) (* вместо обр. ошибки АВОСТ *)
   END WriteTextFile;

END PrivFiles.

^Q PrivFiles.WriteTextFile


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Вторник, 17 Август, 2010 23:35 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Цитата:
Для особых случаев правильнее реализовать соотв. конвертер, нежели делать прямую выгрузку в файл.

Почему?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Среда, 18 Август, 2010 10:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Евгений Темиргалеев писал(а):
Если бы мне требовалось формирование текстового файла, то писал бы в ББ-й текст, который бы штатно выгрузил конвертером. Для особых случаев правильнее реализовать соотв. конвертер, нежели делать прямую выгрузку в файл.
Неправильно сформулировал. Имелось ввиду:
Для большинства задач работы с текстами должны подойти штатные средства: TextModels.Model и конвертеры. Если требуется особый формат загрузки/выгрузки текста, нужно реализовать конвертер.

Про особые ситуации, когда штатные средства не подходят, --- ничего не советую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Среда, 18 Август, 2010 11:04 

Зарегистрирован: Среда, 27 Май, 2009 17:33
Сообщения: 27
Евгений Темиргалеев писал(а):
1) Какая версия ББ?
2) Какая задача?

1) 1.6
2) Вывести содержимое таблицы в *.htm файл.

Ориентировался на пример в первых постах этой темы.
Спасибо большое за пример, переделал, работает отлично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с файлами
СообщениеДобавлено: Среда, 18 Август, 2010 16:02 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
l2qwe писал(а):
Ориентировался на пример в первых постах этой темы.
Там, кстати, тов. Ермаков указывает про использование текстов, но без примера. Поставлю, пожалуй, ссылку...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB