Книга: Программирование на языке Ruby
10.1.4. Прямой доступ к файлу
10.1.4. Прямой доступ к файлу
Для чтения из файла в произвольном порядке, а не последовательно, можно воспользоваться методом seek
, который класс File
наследует от IO
. Проще всего перейти на байт в указанной позиции. Номер позиции отсчитывается от начала файла, причем самый первый байт находится в позиции 0.
# myfile содержит строку: abcdefghi
file = File.new("myfile")
file.seek(5)
str = file.gets # "fghi"
Если все строки в файле имеют одинаковую длину, то можно перейти сразу в начало нужной строки:
# Предполагается, что все строки имеют длину 20.
# Строка N начинается с байта (N-1)*20
file = File.new("fixedlines")
file.seek(5*20) # Шестая строка!
Для выполнения относительного поиска воспользуйтесь вторым параметром. Константа IO::SEEK_CUR
означает, что смещение задано относительно текущей позиции (и может быть отрицательным):
file = File.new("somefile")
file.seek(55) # Позиция 55.
file.seek(-22, IO::SEEK_CUR) # Позиция 33.
file.seek(47, IO::SEEK_CUR) # Позиция 80.
Можно также искать относительно конца файла, в таком случае смещение может быть только отрицательным:
file.seek(-20, IO::SEEK_END) # Двадцать байтов от конца файла.
Есть еще и третья константа IO::SEEK_SET
, но это значение по умолчанию (поиск относительно начала файла).
Метод tell
возвращает текущее значение позиции в файле, у него есть синоним pos
:
file.seek(20)
pos1 = file.tell # 20
file.seek(50, IO::SEEK_CUR)
pos2 = file.pos # 70
Метод rewind
устанавливает указатель файла в начало. Его название («обратная перемотка») восходит ко временам использования магнитных лент.
Для выполнения прямого доступа файл часто открывается в режиме обновления (для чтения и записи). Этот режим обозначается знаком +
в начале строки указания режима (см. раздел 10.1.2).
- 10.1.1. Открытие и закрытие файлов
- 10.1.2. Обновление файла
- 10.1.3. Дописывание в конец файла
- 10.1.4. Прямой доступ к файлу
- 10.1.5. Работа с двоичными файлами
- 10.1.6. Блокировка файлов
- 10.1.7. Простой ввод/вывод
- 10.1.8. Буферизованный и небуферизованный ввод/вывод
- 10.1.9. Манипулирование правами владения и разрешениями на доступ к файлу
- 10.1.10. Получение и установка временных штампов
- 10.1.11. Проверка существования и получение размера файла
- 10.1.12. Опрос специальных свойств файла
- 10.1.13. Каналы
- 10.1.14. Специальные операции ввода/вывода
- 10.1.15. Неблокирующий ввод/вывод
- 10.1.16. Применение метода readpartial
- 10.1.17. Манипулирование путевыми именами
- 10.1.18. Класс Pathname
- 10.1.19. Манипулирование файлами на уровне команд
- 10.1.20. Ввод символов с клавиатуры
- 10.1.21. Чтение всего файла в память
- 10.1.22. Построчное чтение из файла
- 10.1.23. Побайтное чтение из файла
- 10.1.24. Работа со строкой как с файлом
- 10.1.25. Чтение данных, встроенных в текст программы
- 10.1.26. Чтение исходного текста программы
- 10.1.27. Работа с временными файлами
- 10.1.28. Получение и изменение текущего каталога
- 10.1.29. Изменение текущего корня
- 10.1.30. Обход каталога
- 10.1.31. Получение содержимого каталога
- 10.1.32. Создание цепочки каталогов
- 10.1.33. Рекурсивное удаление каталога
- 10.1.34. Поиск файлов и каталогов
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- 9.4. Права доступа к squid
- Глава 29 Доступ к канальному уровню
- 10.5. Транзакции и пути доступа меню
- Настройка доступа пользователей к рабочей книге
- 3.5 Проблемы доступа при использовании нескольких протоколов
- Доступ к существующим рабочим областям для документов
- Есть ли быстрый способ доступа к папкам?
- Как открыть доступ к своей папке другим пользователям?
- Я открыл доступ к папке
- Как сделать так, чтобы папка на одном компьютере в сети была доступна для другого компьютера, даже если первый выключен?
- Говорят, хакеры могут получить доступ к моему почтовому ящику или ICQ. Как им помешать?