OberonCore
https://forum.oberoncore.ru/

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

Автор:  decemberster [ Пятница, 31 Август, 2007 13:14 ]
Заголовок сообщения:  Работа с файлами

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

UPDATE. Уже сам нашел: viewtopic.php?f=23&t=340

Автор:  Илья Ермаков [ Пятница, 31 Август, 2007 13:22 ]
Заголовок сообщения:  Re: Работа с файлами

Используйте Files.File, на который навешивайте Stores.Writer/Reader - и используйте WriteReal/ReadReal:
Код:
VAR f: Files.File;
       wr: Stores.Writer;
       res: INTEGER;
BEGIN
  f := Files.dir.New(Files.dir.This("SomeDirectory"), FALSE);
  wr.ConnectTo(f);
  FOR ... DO
    wr.WriteReal(x)
  END;
  f.Register("SomeFile", "dat", FALSE, res)
END

Автор:  Сергей Губанов [ Пятница, 31 Август, 2007 13:26 ]
Заголовок сообщения:  Re: Работа с файлами

http://msdn2.microsoft.com/en-us/library/Aa363874.aspx

Автор:  Роман М. [ Вторник, 25 Май, 2010 16:58 ]
Заголовок сообщения:  Re: Работа с файлами

Подниму-ка эту тему. Новое - хорошо забытое старое.

Создаю нетипизированный (в понятиях Паскаля) файл:
Код:
MODULE TestFileStore;

   IMPORT Files, Stores, Log := StdLog;
   
   CONST
      buflen = 1024;
      
   TYPE
      Record* = POINTER TO RECORD (Stores.Store)
         size: INTEGER;
         buf: ARRAY buflen OF BYTE;
         x, y: REAL
      END;
   
   PROCEDURE (r: Record) Externalize- (VAR wr: Stores.Writer);
      VAR k: INTEGER;
   BEGIN
      ASSERT(r.size < buflen, 20);
      r.Externalize^(wr);
      wr.WriteInt(r.size);
      FOR k := 0 TO r.size - 1 DO
         wr.WriteByte(r.buf[k])
      END;
      wr.WriteReal(r.x); wr.WriteReal(r.y)
   END Externalize;
   
   PROCEDURE ExportToFile* (r: Record; f: Files.File);
      VAR wr: Stores.Writer; k: INTEGER;
   BEGIN
      wr.ConnectTo(f);
      wr.WriteStore(r)
   END ExportToFile;
   
   PROCEDURE Run*;
      VAR
         rec: Record; f: Files.File; res: INTEGER;
   BEGIN
      NEW(rec);
      
      rec.size := 127;
      rec.x := 10; rec.y := 20; rec.buf[rec.size-1] := -1;
      
      f := Files.dir.New(Files.dir.This("."), Files.exclusive);
      IF f # NIL THEN
         ExportToFile (rec, f);
         f.Register("records", "dat", Files.dontAsk, res);
         IF res # 0 THEN
            Log.String("Error #"); Log.Int( res ); Log.Ln
         END
      END;
      
      rec := NIL
   END Run;
   
END TestFileStore.

:!: TestFileStore.Run

Вот, надо ещё аналог File Of Record добавить. В них есть Seek, аналог которой нужно внести, вычисляя размер записи.

Автор:  Info21 [ Среда, 26 Май, 2010 12:46 ]
Заголовок сообщения:  Re: Работа с файлами

Роман М. писал(а):
ещё надо ещё
А точно надо? Кому и зачем?
Записи в реальной жизни почему-то стремятся варьироваться.
Чем сложнее задача, тем сильнее.

Лично мне случай точно одинаковых записей не встречался никогда.
Стоит ли из-за такого вырожденного случая огород городить?

Автор:  Роман М. [ Среда, 26 Май, 2010 16:37 ]
Заголовок сообщения:  Re: Работа с файлами

Info21 писал(а):
Лично мне случай точно одинаковых записей не встречался никогда.
Да взять хотя бы учебную программу по Паскалю, в которой присутствуют задания по созданию баз данных на основе file of record.

Чаще, бывает нужно прочесть разные блоки файла (например, какого-то формата файла), занося данные в соответствующую структуру типа RECORD.
Для чтения блока данных можно пользоваться примитивной структурой ARRAY OF BYTE. А вот каких-либо стандартных высокоуровневых средств для занесения в RECORD я не вижу.

Например, в Паскале для чтения блока данных из файла в структуру BMPHeader пишем так (одной строкой!):
BlockRead(f, BMPHeader, Sizeof(TBMPHeader), cnt);

Автор:  Info21 [ Среда, 26 Май, 2010 18:48 ]
Заголовок сообщения:  Re: Работа с файлами

Роман М. писал(а):
Info21 писал(а):
Лично мне случай точно одинаковых записей не встречался никогда.
Да взять хотя бы учебную программу по Паскалю, в которой присутствуют задания по созданию баз данных на основе file of record.
Такие задания появились только потому, что в языке есть средство. А учителя они наивные в отношении программирования как девушки, изучающие модные журналы.

Для всего остального нужен каждый раз специфический ридер, и всё.

Автор:  Валерий Лаптев [ Четверг, 27 Май, 2010 10:56 ]
Заголовок сообщения:  Re: Работа с файлами

Ну, в качестве упражнения с двоичными файлами можно хотя бы простую реляционную БД спрограммить... Для студиозов 2 курса весьма полезная лаба... Шоб знали, как он там унутре... :)

Автор:  Евгений Темиргалеев [ Четверг, 27 Май, 2010 12:03 ]
Заголовок сообщения:  Re: Работа с файлами

Валерий Лаптев писал(а):
Ну, в качестве упражнения с двоичными файлами можно хотя бы простую реляционную БД спрограммить...
Если Вы имеете в виду движок БД, то там как раз нужен спец. ридер, а не file of record...

Автор:  Валерий Лаптев [ Четверг, 27 Май, 2010 14:18 ]
Заголовок сообщения:  Re: Работа с файлами

Не... Для начала хотя бы два файла: файл с записями, и файл с метаинформацией (структура записи). Файл с записями - это оно и есть. Файл с метаинформацией, если ограничить размер имени поля - тоже двоичный файл с записями. Поэтому для обучения иметь простой file of record - полезно... :)

Автор:  Евгений Темиргалеев [ Четверг, 27 Май, 2010 16:54 ]
Заголовок сообщения:  Re: Работа с файлами

Валерий Лаптев писал(а):
файл с записями, и файл с метаинформацией (структура записи). Файл с записями - это оно и есть.
не пойму как можно увязать запись таблицы БД с определяемой во время выполнения структурой с зафиксированным на этапе компиляции типом-записью

Автор:  Илья Ермаков [ Воскресенье, 30 Май, 2010 15:54 ]
Заголовок сообщения:  Re: Работа с файлами

Вот вам file of record, в точности:

viewtopic.php?f=2&t=2006

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