В некоторых случаях может потребоваться прочитать или записать что-то в определенное место в файле. К примеру, это может быть очень большой файл, но мы знаем где именно нужно выполнить изменение в нем, для этого не нужно читать его всего. Данная инструкция показывает, как использовать поиск позиции в контексте операций над обычным текстовом файле файла.

1. Создайте файл flatfile.txt со следующим содержимым:

Премиум 👑 канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Подписаться на канал

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК ЧАТ в Telegram


2. Создайте файл fileseek.go со следующим содержимым:

3. Запустите код через go run fileseek.go;
4. Посмотрите на вывод:

файлы golang

5. Отображение файла в xxd flatfile.txt:

файлы go

Как написать код для программы, что находит позицию в файле?

В предыдущем примере используется файл flatfile.txt, над которым выполняется поиск в нем, прочтение и запись в определенную позицию в файле. В общем и целом для перемещения позиции текущего указателя в File может использоваться метод Seek. Он принимает два аргумента, это позиция и то, как считать позицию, 0 — относительно оригиналу файла, 1 — относительно текущей позиции, 2 — относительно конца строки. В таком случае вы можете переместить курсор внутри файла. Метод Seek используется для имплементации функции readLine в коде выше.

os.File также содержит методы ReadAt и WriteAt. При использовании методов, байты должны быть записаны/прочитаны, также должна даваться отправная точка. Это упрощает запись и чтение для определенной позиции в файле.

На заметку: Обратите внимание, что в примере предполагается, что каждая руна составляет один байт, что не обязательно должно быть так для специальных символов и так далее.

3 7 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Владимир
Владимир
4 месяцев назад

в функции writeRecord необходимо учесть номер записи (при указанном в примере формате файла flatfile.txt)
Примерно так:

   switch column {
   case «id»:
      definedLen = 4
   case «first»:
      position += 4 + int64(line)
   case «last»:
      position += 14 + int64(line)
   default:
      return errors.New(«Столбец не определен»)
   }
Если не учитывать «набежавшие» переводы строк, то поля наползают друг на друга.

Если файл flatfile.txt такой вот:

123.Jun…….Wong……12..Novak…..Jurgen….10..Radomir…Sohlich…

то, видимо, придется щирину записи сделать = 24 и не учитывать добавки int64(line)

Иван Иванов
Иван Иванов
2 месяцев назад

Это мой первый комментарий на этом сайте. Но заходил сотню раз.
Спасибо, брат!)