cpp

Файлы произвольного доступа

Файл можно читать не только с самого начала, но и с произвольной позиции. Для чтения файла с произвольной позиции предназначен метод ReadAt() структуры File (см. разд. 14.4):

(*os.File).ReadAt(b []byte, off int64) (n int, err error)

Записывать в файл также можно с произвольной позиции. Для этого предназначен метод WriteAt() структуры File (см. разд. 14.3):

(*os.File).WriteAt(b []byte, off int64) (n int, err error)

С помощью метода Seek() структуры File можно задать или получить позицию курсора. Формат метода:

(*os.File).Seek(offset int64, whence int) (ret int64, err error)

В параметре offset задается смещение относительно позиции whence. В параметре whence можно указать следующие константы или соответствующие им значения:

  • io.SeekStart0 — начало файла;
  • io.SeekCurrent1 — текущая позиция курсора;
  • io.SeekEnd2 — конец файла.

Метод Seek() возвращает два значения. Через первое значение доступна текущая позиция, а через второе — объект ошибки или значение nil, если операция выполнена успешно.

Пример использования метода Seek() приведен в листинге 14.2.

Листинг 14.2. Файлы произвольного доступа

package main

import (
   "fmt"
   "io"
   "os"
)

func main() {
   mode := os.O_RDWR | os.O_CREATE | os.O_TRUNC
   file, err := os.OpenFile(`C:\book\test.txt`, mode, 0o777)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   if _, err = file.WriteString("10203040"); err != nil {
      fmt.Println(err)
      return
   }
   // Получаем текущую позицию курсора
   pos, err := file.Seek(0, io.SeekCurrent)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("pos =", pos) // pos = 8
   // Перемещаем курсор в позицию 2 относительно начала файла
   pos, err = file.Seek(2, io.SeekStart)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("pos =", pos) // pos = 2
   if _, err = file.WriteString("56"); err != nil {
      fmt.Println(err)
      return
   }
   // Смещение -6 относительно конца файла
   pos, err = file.Seek(-6, io.SeekEnd)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("pos =", pos) // pos = 2
   // Считываем два байта
   buf := make([]byte, 2)
   n, err := file.Read(buf)
   if err != nil {
      if err != io.EOF {
         fmt.Println(err)
         return
      }
   }
   fmt.Println(string(buf[:n])) // 56
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp