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 МБ ![]() |
Автор: | 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/ |