OberonCore
https://forum.oberoncore.ru/

Работа с файлами
https://forum.oberoncore.ru/viewtopic.php?f=23&t=340
Страница 1 из 3

Автор:  Прохожий [ Четверг, 16 Ноябрь, 2006 21:15 ]
Заголовок сообщения:  Работа с файлами

Отчаянно пытаюсь записать строку в текстовый файл, но не получается.

Код:
MODULE Mm;

IMPORT Files, TextMappers, Stores;

PROCEDURE Do* ();
VAR
   f: Files.File;
   loc: Files.Locator;
   w: Stores.Writer;
   res: INTEGER;
BEGIN
   loc := Files.dir.This("");
   loc := loc.This("jfdjhf");
   f := Files.dir.New(loc, FALSE);
   f.Register("t", "txt", TRUE, res);
   w.ConnectTo(f);
   w.WriteString("sdjsjdhsjdhs");
   f.Close();
END Do;

END Mm.


Ошибка выскакивает, когда производится w.ConnectTo(f) - похоже на то, что я забыл сделать что-то перед этим, но что?

Автор:  Илья Ермаков [ Четверг, 16 Ноябрь, 2006 22:38 ]
Заголовок сообщения: 

Дело в том, что Register закрывает файл. New создает в указанном каталоге файл под временным именем. После вывода файл регистрируется под постоянным именем вызовом Register.
Надо так:
Код:
MODULE Mm;

IMPORT Files, TextMappers, Stores;

PROCEDURE Do* ();
VAR
   f: Files.File;
   loc: Files.Locator;
   w: Stores.Writer;
   res: INTEGER;
BEGIN
   loc := Files.dir.This("");
   loc := loc.This("jfdjhf");
   f := Files.dir.New(loc, FALSE);
   w.ConnectTo(f);
   w.WriteString("sdjsjdhsjdhs");
   f.Register("t", "txt", TRUE, res);
END Do;

END Mm.

Вообще, модуль Files малость странноват, это вызвано тем, что ББ некогда был ориентирован также на старые MacOS, а там были свои "прибабахи"...

Да, еще - в данном случае будет выводится строка в формате Юникод. Чтобы работать с ANSI-файлов, используйте w.WriteSString.

Есть еще способ работы с текстовыми файлами - создать/открыть TextModels.Model, а затем сохранять ее в файл через txt-конвертер c помощью Converters.Export. Upd: см. пример: viewtopic.php?p=50633#p50633

Автор:  Прохожий [ Пятница, 17 Ноябрь, 2006 08:39 ]
Заголовок сообщения: 

Ага, спасибо.

Автор:  Cardinal [ Суббота, 18 Ноябрь, 2006 23:11 ]
Заголовок сообщения: 

Вот ещё способ - записывая вьюшку:

Код:
   ...
   view := TextViews.dir.New(model);
   loc := Files.dir.This("Test/Rsrc/Log");
   filename := "log.txt";

   (* ищу конвертер для файлов с расширением txt *)
   conv := Converters.list;
   WHILE (conv # NIL) & (conv.ext # "txt") DO conv := conv.next END;
   IF conv.ext ="txt" THEN
      Views.Register(view, Views.dontAsk, loc, filename$, conv, res);
      ASSERT(res # 0, 20)
   END;
   ...


Кстати, на http://www.o3-software.de/ есть несколько подсистем, одна из которых (O3stdConfig) позволяет работать с файлами конфигурации.

Автор:  Сергей Губанов [ Понедельник, 20 Ноябрь, 2006 12:05 ]
Заголовок сообщения: 

Только надо заменить IF conv.ext = "txt" THEN на IF conv # NIL THEN.

Автор:  Trurl [ Среда, 22 Ноябрь, 2006 12:56 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
New создает в указанном каталоге файл под временным именем. После вывода файл регистрируется под постоянным именем вызовом Register.

Если вдаваться в подробности, то New вообще не создает файла ОС. Реально файл создается, когда буферы переполняются.

Илья Ермаков писал(а):
Вообще, модуль Files малость странноват, это вызвано тем, что ББ некогда был ориентирован также на старые MacOS, а там были свои "прибабахи"...

Не, у MacOS файлы как и везде. ББ имитирует файловую систему Oberon.

Автор:  Info21 [ Среда, 22 Ноябрь, 2006 18:54 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
модуль Files малость странноват


Странноват, в смысле, необычен, это да.
Что-то я все время забываю: кроме поддержки совсем <длинных> файлов, какие там еще дефекты?

Автор:  Илья Ермаков [ Среда, 22 Ноябрь, 2006 21:49 ]
Заголовок сообщения: 

Основной недостаток - не поддерживаются длинные файлы... А обратно совместимое расширение не предусмотрено, ничего вроде HandleMessage не введено...

Автор:  CheshireCat [ Среда, 29 Ноябрь, 2006 09:25 ]
Заголовок сообщения: 

Trurl писал(а):
Не, у MacOS файлы как и везде. ББ имитирует файловую систему Oberon.

вот именно. там файл создается анонимным и в каталоге регистрируется обычно только перед завершением с ним работы (можно совсем не регистрировать и тогда его содержимое потеряется при утрате всех ссылок на него в работающем с ним модуле, а место на диске будет потом автоматически возвращено системе при дисковой сборке мусора).

смысл откладывания регистрации видимо в том что система увидит файл только когда он будет явно ОПУБЛИКОВАН модулем. В этот момент он должен наверняка иметь корректное, полное содержимое. Пригодное для использования другими модулями. Это просто такая идеология для большей корректности работы.

Автор:  rv82 [ Понедельник, 23 Апрель, 2007 11:52 ]
Заголовок сообщения: 

Подскажите пожалуйста, каким образом в ББ осуществляется чтение бинарного файла? А ещё, что значит "не поддерживаются длинные файлы...". Какого именно размера не поддерживаются?

Автор:  Борис Рюмшин [ Понедельник, 23 Апрель, 2007 12:21 ]
Заголовок сообщения: 

Если склероз не изменяет, то не более 2 Гб.

Автор:  rv82 [ Понедельник, 23 Апрель, 2007 12:55 ]
Заголовок сообщения: 

Борис Рюмшин писал(а):
Если склероз не изменяет, то не более 2 Гб.

Тогда ничего страшного. Лишь бы не 2 МБ :D

Автор:  rv82 [ Понедельник, 07 Май, 2007 09:31 ]
Заголовок сообщения: 

rv82 писал(а):
Подскажите пожалуйста, каким образом в ББ осуществляется чтение бинарного файла?

Всё, допетрил! Ничего сложного. Вот теперь можно спокойно приступать к работе в BlackBox :). Интересно было бы задать вопрос производителям ББ, зачем такие сложности для таких простых операций (чтения/записи)?

Автор:  Илья Ермаков [ Понедельник, 07 Май, 2007 10:48 ]
Заголовок сообщения: 

В смысле?
Какие именно сложности?
Там просто много различных "необычностей" :-)
Простой курьер (Reader/Writer), позволяющий читать только байты и ничего кроме байтов - это все в рамках общей схемы Carrier-Rider-Mapper (или Носитель-Курьер-Проектор), при которой Rider содержит только доступ к элементарным логическим элементам, зависящий от конкретной реализации носителя. Все операции по работе с данными в терминах более высокоуровневых единиц выносятся в независимый от реализации носителя проектор (Stores.Reader/Stores.Writer).

Сам набор методов - частично вызван "долгой историей", а частично - диктуется общей схемой... Например, то, что имя новому файлу может быть присвоено только после его записи - из-за того, что с одним и тем же файлом может работать много клиентов. А в момент создания файла нужно обеспечить эксклюзивность доступа. Например, если несколько модулей намерены создать файл с одним и тем же именем, то они будут записывать данные не в один файл и не запортят его, а в индивидуальные временные файлы, а уж кто зарегистрирует файл первым - как повезет :-)
Ну и т.п. В частности, объект File к одному файлу в среде всегда существует только один. Если Вы вызвали Old, то сначала ищется в памяти уже существующий объект... И закрывать явно файлы в большинстве случаев - именно поэтому - никогда не надо (кроме тех случаев, когда работаете в неразделяемомо режиме со своими файлами), т.к. неизвестно, кто еще с ним работает...

Автор:  Виктор [ Среда, 06 Июнь, 2007 13:20 ]
Заголовок сообщения: 

при отработке Вашего примера если сообщение написать русскими буквами, например "Привет", то в файл записывактся следующая последоватеоьность "П р и в е т" в 16-ричном виде выглядит так
CF 00 F0 00 E8 00 E2 00 E5 00 F2 00 00 00
П р и в е т

это связано с unicod?

Автор:  Виктор [ Среда, 06 Июнь, 2007 13:23 ]
Заголовок сообщения: 

все верно
надо мне внимательней читать :(

Автор:  Иван Горячев [ Среда, 06 Июнь, 2007 13:31 ]
Заголовок сообщения: 

Виктор писал(а):
это связано с unicod?

Это связано с тем, что тип CHAR в системе двухбайтовый, и процедура Stores.Writer.WriteString (IN x: ARRAY OF CHAR) честно оба байта и записывает (но не в юникоде!). Для того, чтобы получить обычную строчку (в кодировке Win-1251) нужно использовать WriteSString.

Это справедливо для версии 1.5 и старше. В версии 1.6 перешли на юникод, и приведённый пример будет выводить строку в юникоде:
1F 04 40 04 38 04 32 04 35 04 42 04 00 00

Автор:  Wlad [ Среда, 06 Июнь, 2007 13:45 ]
Заголовок сообщения: 

А перед этим ничего не должно писаться? в смысле двух байт, показывающих что-то там такое на счёт расположения бит и байт...

Автор:  Иван Горячев [ Среда, 06 Июнь, 2007 15:05 ]
Заголовок сообщения: 

Wlad писал(а):
А перед этим ничего не должно писаться? в смысле двух байт, показывающих что-то там такое на счёт расположения бит и байт...

Нет. Просто лепится строка как есть. Именно поэтому в 1.6 получается юникод, а в 1.5 - нет (фактически - win-1251, разделённая нулями. И то только из-за того, что с клавиатуры именно такое ввели).

Автор:  ОтецСергий [ Среда, 15 Август, 2007 14:08 ]
Заголовок сообщения:  Re: Работа с файлами

Освоение BB начал с попытки реализовать повседневную задачу - прочитать текстовый файл.
Модуль компилируется, но при попытке запуска выдает ошибку.
Что я не так делаю?

Код:
MODULE Конвертер ;
   IMPORT  StdLog, In, Math, ObxAscii;
   
   PROCEDURE ReadF* ();
      VAR файл: ObxAscii.Text;
         c:   CHAR;
   BEGIN
      файл := ObxAscii.Open(NIL, 'c:\TEMP\ttt.txt');
      ObxAscii.ReadChar(файл, c);
      файл := NIL;
   END ReadF;
   
END Конвертер.

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/