OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 17 Ноябрь, 2019 07:21

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




Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Работа с файлами
СообщениеДобавлено: Четверг, 16 Ноябрь, 2006 21:15 

Зарегистрирован: Воскресенье, 19 Март, 2006 17:37
Сообщения: 11
Отчаянно пытаюсь записать строку в текстовый файл, но не получается.

Код:
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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Дело в том, что 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 

Зарегистрирован: Воскресенье, 19 Март, 2006 17:37
Сообщения: 11
Ага, спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 18 Ноябрь, 2006 23:11 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
Вот ещё способ - записывая вьюшку:

Код:
   ...
   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 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Только надо заменить IF conv.ext = "txt" THEN на IF conv # NIL THEN.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Ноябрь, 2006 12:56 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
Илья Ермаков писал(а):
New создает в указанном каталоге файл под временным именем. После вывода файл регистрируется под постоянным именем вызовом Register.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Ноябрь, 2006 18:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Илья Ермаков писал(а):
модуль Files малость странноват


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


Последний раз редактировалось Info21 Воскресенье, 03 Декабрь, 2006 12:03, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 22 Ноябрь, 2006 21:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Основной недостаток - не поддерживаются длинные файлы... А обратно совместимое расширение не предусмотрено, ничего вроде HandleMessage не введено...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 29 Ноябрь, 2006 09:25 

Зарегистрирован: Вторник, 04 Июль, 2006 13:04
Сообщения: 88
Откуда: Novosibirsk
Trurl писал(а):
Не, у MacOS файлы как и везде. ББ имитирует файловую систему Oberon.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 23 Апрель, 2007 11:52 

Зарегистрирован: Вторник, 13 Март, 2007 06:15
Сообщения: 93
Откуда: Кемерово, КузГТУ
Подскажите пожалуйста, каким образом в ББ осуществляется чтение бинарного файла? А ещё, что значит "не поддерживаются длинные файлы...". Какого именно размера не поддерживаются?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 23 Апрель, 2007 12:21 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4335
Откуда: Россия, Орёл
Если склероз не изменяет, то не более 2 Гб.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 23 Апрель, 2007 12:55 

Зарегистрирован: Вторник, 13 Март, 2007 06:15
Сообщения: 93
Откуда: Кемерово, КузГТУ
Борис Рюмшин писал(а):
Если склероз не изменяет, то не более 2 Гб.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 07 Май, 2007 09:31 

Зарегистрирован: Вторник, 13 Март, 2007 06:15
Сообщения: 93
Откуда: Кемерово, КузГТУ
rv82 писал(а):
Подскажите пожалуйста, каким образом в ББ осуществляется чтение бинарного файла?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 07 Май, 2007 10:48 
Модератор
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 06 Июнь, 2007 13:20 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 06 Июнь, 2007 13:23 

Зарегистрирован: Среда, 06 Июнь, 2007 04:52
Сообщения: 2
все верно
надо мне внимательней читать :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 06 Июнь, 2007 13:31 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Виктор писал(а):
это связано с 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 06 Июнь, 2007 13:45 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1436
А перед этим ничего не должно писаться? в смысле двух байт, показывающих что-то там такое на счёт расположения бит и байт...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 06 Июнь, 2007 15:05 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Wlad писал(а):
А перед этим ничего не должно писаться? в смысле двух байт, показывающих что-то там такое на счёт расположения бит и байт...

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


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

Зарегистрирован: Среда, 15 Август, 2007 13:46
Сообщения: 4
Освоение 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 Конвертер.


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

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


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

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


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

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