Rapid-Q Documentation by William Yu (c)1999 Глава 7


7. Концепция потоков. (Introduction to streams)

Rapid-Q поддерживает файловые потоки, в отличие от обычной команды OPEN, используемой в Basic. Функционально это то же самое, однако вызов осуществляется по другому. Замечаельным свойством потоков является еограниченность размера и возможность копировать из разных типов потоков то есть из памяти в файл и обратно.

7.1 Файловые потоки (File streams)
Файловые потоки используются для создания, чтения и записи файлов. Все потоки открываются как бинарныебез возможности блокирования, то есть все файлы открываются как разделяемые. All streams are opened as binary, with no locking capabilities (ie. all files you open are shared). Возможны следующие режимы:
   fmCreate    - Создать файл (для чтения \записи), если фай существует, то он урезается до нулевой длины.
   fmOpenRead  - Открыть файл только для чтения
   fmOpenWrite - Открыть файл только для записи 
   fmOpenReadWrite - Открыть файл только для чтения и записи
Чтобы открыть файл, вы должны передать имя файла и указать режим
     DIM File AS QFileStream

     File.Open("Test.txt", fmOpenRead)
В примере будет открыт файл "Test.txt" только для чтения. См. RAPIDQ.INC . CONST fmCreate = 65535 CONST fmOpenRead = 0 CONST fmOpenWrite = 1 CONST fmOpenReadWrite = 2 Чтобы прочитать данные используйте методы ReadNum и ReadStr.
     PRINT File.ReadNum(Num_SINGLE)   '-- Чтение  4 байт как переменной типа SINGLE
     PRINT File.ReadStr(1024)         '-- Чтение  1024 байт
Другим применением будет сохранение величины в переменной заданного типа, используя обычные процедуры Read и Write
     File.Read(A&)          '-- Чтение переменной типа long и сохранение ее в A&
     File.Write(B#)         '-- Запись переменной B# типа double 

     '-- или более длинный вид записи :
     A& = File.ReadNum(Num_LONG)
     File.WriteNum(B#, Num_DOUBLE)
После того как вы поработали с файлом не забудьте закрыть его. Вы можете затем повторно использовать QFileStream для открытия другого файла. Для проверкитого, достигли ли вы конца файла можно или сравнивать текущую позицию File.Position с размером файла File.Size или проверять равно ли File.EOF true (-1). Пока File.Position меньше File.Size вы еще не достигли конца файла. Есть два способа проверки существования файла:
     IF FileExists("Test.txt") <> FALSE THEN
       File.Open("Test.txt", fmOpenRead)
     END IF
Но лучше
     IF File.Open("Test.txt", fmOpenRead) = FALSE THEN
        ShowMessage("Could not open file")
     END IF
File.Open вовращает ненулевое значение, если файл успешно открыт и 0 - в другом случае.

7.2 Потоки в памяти (Memory streams)
Потоки в памяти подобны файловым потокам. Все методы подобны, такие как ReadNum, WriteNum, etc... Разница в том, что потоки хранятся в памяти, где могут увличиваться\ужиматься без ограничения. (The only difference is that memory streams are stored in memory, which can grow/shrink with no upper bounds.) Это дает возможность хранить массивы чисел (arrays of numbers) в потоке (см. ARRAYS.BAS) Потоки в памяти могу служить многим целям, это ограничено только вашей фантазией. Например для хранения временных данных. Как можно копировать один поток в другой? Очень просто, вы можете копировать между потоками разных типов тоже (т.е. File to Memory) или одного и того же (Memory to Memory).
    DIM File AS QFileStream
    File.Open("test.txt", fmOpenRead)

    DIM Memory AS QMemoryStream
    Memory.CopyFrom(File, File.Size)  '-- Копировать все
Как видно мы просто скопировали все содержимое файла "test.txt" в поток в памяти и теперь можем менять данные в потоке без внесения изменений в файл.

7.3 Сохранение данных пользовательского типа и массивов в файл (Saving/Loading UDTs and Arrays)
Для сохранения данных пользовательского типа надо просто передать их в QFileStream или QMemoryStream.
    TYPE TTest
        S AS STRING*8
        N AS INTEGER
    END TYPE

    DIM Test AS TTest
    DIM File AS QFileStream

    File.Open("test.txt", fmCreate)
    File.WriteUDT(Test)
    File.Close
В примере выше 12 байт были сохранены в файл test.txt. 8 байт как строка фиксированной длины S, и 4 байта как N. Для чтения UDT используйте метод ReadUDT
    File.Open("test.txt", fmOpenRead)
    File.ReadUDT(Test)
запись\чтение массивов также несложно
    DIM A(1 TO 100) AS LONG
    DIM File AS QFileStream

    File.Open("test.txt", fmCreate)
    File.SaveArray(A(1), 100)
    File.Close
Первый параметр SaveArray это элемент массива с котрого надо начать сохранение (любой от 1 до 100 в нашем примере). Следующий параметр указывает сколько элементов массива следует сохранить. Мы указали 100 элементов. Аналогично можно использовать LoadArray для загрузки массива. Similarly, we can use LoadArray to retrieve our data:
    File.Open("test.txt", fmOpenRead)
    File.LoadArray(A(1), 100)
Потоки очень популярны во многих языках программирования высокого уровня для работы с файлами или памятью.


Prev Глава Содержание Next Глава