PureBasic

Руководство - Чтение и запись файлов

В этом примере будет записано 100 случайных записей, каждая из которых содержит байт (Bute), число с плавающей запятой (Float), целое 4-х байтное число (long) и строку (String). Затем он считывает все записи и отображает их в окне debug.

Он демонстрирует работу команд GetTemporaryDirectory(), CreateFile(), OpenFile(), Eof(), а также Read и Write.

Он прекрасно работает, насколько это возможно, но имеет недостаток. Поскольку у строкового значения есть переменная длина - вы не можете случайно обращаться к записям, потому что вы не можете предсказать, где каждая новая запись начнется в файле. Они должны быть прочитаны в той последовательности, в которой они были написаны. Это не проблема с небольшим количеством записей, созданными здесь, но это может быть неудобством для более крупного файла. PureBasic предлагает также способ справиться с этой ситуацией, но пример будет слишком сложным для этой темы. Для решения данного вопроса смотрите раздел Базы данных в справочном руководстве.
  EnableExplicit
  ; Определить константы:
  #MAXBYTE = 255
  #MAXLONG = 2147483647
  
  ; Определить некоторые переменные.
  Define.f Float
  Define.l Count, File
  Define.s Folder, FileName, String
  
  ; Создать временное имя файла.
  Folder = GetTemporaryDirectory()
  FileName = Folder + "test.data"
  
  ; Создать временный файл.
  ; Если используется #PB_Any, CreateFile возвращает Номер файла.  
  ; Это полезно, если одновременно вы должны открыть несколько файлов.
  File = CreateFile(#PB_Any, FileName)
  
  If File
    ; Если файл создан успешно - запишем 100 случайных записей.
    For Count = 1 To 100
      
      ; Запишем случайный байт (значение 0 - 255).
      WriteByte(File, Random(#MAXBYTE))
      
      ; Создать и записать произвольное число с плавающей запятой (Float).
      ; Эти вычисления необходимы для того, чтобы число имело компонент с плавающей запятой.
      Float = Random(#MAXLONG) / ((Random(7) + 2) * 5000)
      WriteFloat(File, Float)
      
      ; Запись случайного 4-х байтного числа (long).
      WriteLong(File, Random(#MAXLONG))
      
      ; Создание и запись произвольной строки в формате Unicode.
      ; Обратите внимание на использование WriteStringN для разграничения строки с маркером конца строки.
      String = "String " + StrU(Random(#MAXLONG))
      WriteStringN(File, String, #PB_Unicode)
      
    Next Count
    
    ; Закрыть файл.
    CloseFile(File)
    
  Else
    ; Если создать файл не удалось.
    Debug "Не удалось создать файл: " + FileName 
    
  EndIf
  
  ; В этот раз откройте файл для чтения.
  File = ReadFile(#PB_Any, FileName)
  
  If File
    ; Если открыть файл удалось -  прочитать и отобразить записи из файла.
    
    ; Сбросить счетчик.
    Count = 1
    
    ; Цикл до достижения "конца файла".
    ; Будут прочитаны все записи независимо от их количества.
    While Eof(File) = 0
      
      ; Печать строки заголовка.
      Debug "------------------------------------------------------------------------------------------------"
      
      Debug "[" + StrU(Count) + "]"
      Count + 1
      ; Прочитаем и распечатаем значения байта (Bute).
      Debug StrU(ReadByte(File), #PB_Byte)
      
      ; Прочитаем значения с плавающей запятой (Float).
      Debug StrF(ReadFloat(File))
      
      ; Прочитаем 4-х байтные целые значения (Long).
      Debug StrU(ReadLong(File), #PB_Long)
      
      ; Прочитаем значения строки (String).
      Debug ReadString(File, #PB_Unicode)
      
    Wend
    
    ; Распечатайте завершающую линию.
    Debug "------------------------------------------------------------------------------------------------"
    
    ; Закрыть файл.
    CloseFile(File)
    
    ; Удалить файл.
    DeleteFile(FileName)
    
  Else
    ; Если открыть файл не удалось.
    Debug "Не удалось открыть файл: " + FileName
    
  EndIf

Навигация Руководства

< Директивы компилятора - Обзор - Доступ к памяти >