Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
# Добавить строку в конец и закрыть файл.
logfile.puts "Stardate 47824.1: Our show has been canceled."
logfile.close
10.1.4. Прямой доступ к файлу
Для чтения из файла в произвольном порядке, а не последовательно, можно воспользоваться методом
seek
File
IO
# 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.5. Работа с двоичными файлами
Когда-то давно программисты на языке С включали в строку указания режима символ
"b"
Исключение составляет семейство операционных систем Windows, в которых различие все еще имеет место. Основное отличие двоичных файлов от текстовых на этой платформе состоит в том, что в двоичном режиме конец строки не преобразуется в один символ перевода строки, а представляется в виде пары «возврат каретки — перевод строки». Еще одно важное отличие — интерпретация символа control-Z как конца файла в текстовом режиме:
# Создать файл (в двоичном режиме).
File.open("myfile","wb") {|f| f.syswrite("12345 326789r") }
#Обратите внимание на восьмеричное 032 (^Z).
# Читать как двоичный файл.
str = nil
File.open("myfile","rb") {|f| str = f.sysread(15) )
puts str.size # 11
# Читать как текстовый файл.
str = nil
File.open("myfile","r") {|f| str = f.sysread(15) }
puts str.size # 5
В следующем фрагменте показано, что на платформе Windows символ возврата каретки не преобразуется в двоичном режиме:
# Входной файл содержит всего одну строку: Строка 1.
file = File.open("data")
line = file.readline # "Строка 1.n"
puts "#{line.size} символов." # 10 символов,
file.close
file = File.open("data","rb")
line = file.readline # "Строка 1.rn"
puts "#{line.size} символов." # 11 символов.
file.close
Отметим, что упомянутый в коде метод
binmode
file = File.open("data")
file.binmode
line = file.readline # "Строка 1.rn"
puts {line.size} символов." # 11 символов.
file.close
При необходимости выполнить низкоуровневый ввод/вывод можете воспользоваться методами
sysread
syswrite
sysread
input = File.new("infile")
output = File.new("outfile")
instr = input.sysread(10);
bytes = output.syswrite("Это тест.")
Отметим, что метод
sysread
EOFError
SystemCallError