OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 12:54

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 10 Декабрь, 2020 06:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Файл calc.txt в корне Блэкбокса
Код:
Тут какой то текст:

#3.141592653589793
#3.141592653589793

тут будет результат сложения двух действительных чисел:
#
конец файла


Пример работы с файлом, применяя только модули Files и Strings.

Код:
MODULE ObxFilesDemo;

   IMPORT Files, Strings;

   PROCEDURE OpenReadModifyAndSaveBack* (path, name: ARRAY OF CHAR);
   VAR
      file, newFile: Files.File; r: Files.Reader; w: Files.Writer;
      b: BYTE; str: ARRAY 64 OF CHAR; pos, res: INTEGER;
      r1, r2, r3: REAL;
   BEGIN
      file := Files.dir.Old(Files.dir.This(path), name$, Files.shared);
      ASSERT(file # NIL, 21);
      r := file.NewReader(NIL);
      
      r.ReadByte(b);
      WHILE (~r.eof) & (b # ORD("#")) DO
         r.ReadByte(b);
      END;
      ASSERT(~r.eof, 22);
      r.ReadByte(b);
      pos := 0;
      WHILE (~r.eof) & ((b = ORD(".")) OR (b >= ORD("0")) & (b <= ORD("9"))) DO
         str[pos] := CHR(b);
         INC(pos);
         r.ReadByte(b);
      END;
      ASSERT(~r.eof, 23);
      str[pos] := 0X;
      Strings.StringToReal(str, r1, res);
      ASSERT(res = 0, 24);
      
      r.ReadByte(b);
      WHILE (~r.eof) & (b # ORD("#")) DO
         r.ReadByte(b);
      END;
      ASSERT(~r.eof, 25);
      r.ReadByte(b);
      pos := 0;
      WHILE (~r.eof) & ((b = ORD(".")) OR (b >= ORD("0")) & (b <= ORD("9"))) DO
         str[pos] := CHR(b);
         INC(pos);
         r.ReadByte(b);
      END;
      ASSERT(~r.eof, 26);
      str[pos] := 0X;
      Strings.StringToReal(str, r2, res);
      ASSERT(res = 0, 27);
      
      r3 := r1 + r2;
      
      Strings.RealToString(r3, str);
      
      r.ReadByte(b);
      WHILE (~r.eof) & (b # ORD("#")) DO
         r.ReadByte(b);
      END;
      ASSERT(~r.eof, 28);
      
      newFile := Files.dir.New(Files.dir.This(path), Files.dontAsk);
      res := r.Pos();
      r.SetPos(0);
      w := newFile.NewWriter(NIL);
      FOR pos := 0 TO res - 1 DO
         r.ReadByte(b);
         w.WriteByte(b);
      END;
      FOR pos := 0 TO LEN(str$) - 1 DO
         w.WriteByte(SHORT(SHORT(ORD(str[pos]))))
      END;
      r.ReadByte(b);
      WHILE (~r.eof) DO
         w.WriteByte(b);
         r.ReadByte(b);
      END;
      
      newFile.Register(name$, "", Files.dontAsk, res);
      ASSERT(res = 0, 29);
      
      file.Close;
      newFile.Close;
      
   END OpenReadModifyAndSaveBack;


END ObxFilesDemo.

"ObxFilesDemo.OpenReadModifyAndSaveBack('', 'calc.txt')"


Последний раз редактировалось Иван Денисов Четверг, 10 Декабрь, 2020 06:08, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2020 06:05 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пока делал этот пример, обнаружил, что в режиме exclusive файлы не могут быть сохранены из-за
Код:
ASSERT(f.state = new, 20);

В HostFiles Register

что противоречит документации
"An exclusively opened file may be modified (mutable file), which is useful for simple data base applications."

Надо либо документацию поправить, либо этот ассерт изменить на
Код:
ASSERT(f.state = new OR f.state = exclusive, 20);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2020 12:09 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Кмк, не противоречит, поскольку

Документация писал(а):
Register makes an anonymous file permanently available.


Register - это регистрация файла в файловой системе с именем. Это не про сохранение открытого в режиме exclusive и модифицированного файла
Если какие-то изменения в файле "висят" в буферах, то надо f.Close, и все буферы окажутся на диске. А если над "отрубить" конец файла, то F.Flush, емнип.


Новичкам чрезвычайно важно первым делом разъяснить, что в Обероне/ББ понятие файла и понятие имени файла отделены. Это фундаментальная разница, без этого им будет непонятно, что за логика в интерфейсе Files.

Файлы могут быть анонимными. Программа может создать файл, попользоваться им, а потом передумать - не регистрировать его. А может - захотеть и зарегистрировать - т.е. занести в каталог файлов с определенным именем. До момента регистрации у файла нет имени - он анонимный. Соответственно доступ к нему эксклюзивный: только у тех (частей программы), которым передается собсно объект Files.File.

Как только файл зарегистрирован, к нему можно получать доступ по имени через Files.dir.Old.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 10 Декабрь, 2020 17:38 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
И точно! Просто никогда не открывал файл в режиме exclusive, поэтому не задумывался над этим.
Получается, что в таком режиме что-то вставить в файл не так просто. Новые данные затирают старые. Проще и правда сделать новый файл, переписать до точки вставки, вставить данные и дописать остаток старого файла, как у меня сделано в примере в первом сообщении.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 12 Декабрь, 2020 12:18 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Иван Денисов писал(а):
Проще и правда сделать новый файл, переписать до точки вставки, вставить данные и дописать остаток старого файла, как у меня сделано в примере в первом сообщении.
Разве не должно так и быть? Это ж файлы.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

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


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

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


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

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