OberonCore
https://forum.oberoncore.ru/

Открытие, модификация и сохранение файла на уровне Files
https://forum.oberoncore.ru/viewtopic.php?f=35&t=6693
Страница 1 из 1

Автор:  Иван Денисов [ Четверг, 10 Декабрь, 2020 06:01 ]
Заголовок сообщения:  Открытие, модификация и сохранение файла на уровне Files

Файл 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:05 ]
Заголовок сообщения:  Re: Открытие, модификация и сохранение файла на уровне Files

Пока делал этот пример, обнаружил, что в режиме 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);

Автор:  adimetrius [ Четверг, 10 Декабрь, 2020 12:09 ]
Заголовок сообщения:  Re: Открытие, модификация и сохранение файла на уровне Files

Кмк, не противоречит, поскольку

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


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


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

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

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

Автор:  Иван Денисов [ Четверг, 10 Декабрь, 2020 17:38 ]
Заголовок сообщения:  Re: Открытие, модификация и сохранение файла на уровне Files

И точно! Просто никогда не открывал файл в режиме exclusive, поэтому не задумывался над этим.
Получается, что в таком режиме что-то вставить в файл не так просто. Новые данные затирают старые. Проще и правда сделать новый файл, переписать до точки вставки, вставить данные и дописать остаток старого файла, как у меня сделано в примере в первом сообщении.

Автор:  Info21 [ Суббота, 12 Декабрь, 2020 12:18 ]
Заголовок сообщения:  Re: Открытие, модификация и сохранение файла на уровне Files

Иван Денисов писал(а):
Проще и правда сделать новый файл, переписать до точки вставки, вставить данные и дописать остаток старого файла, как у меня сделано в примере в первом сообщении.
Разве не должно так и быть? Это ж файлы.

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