Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Имеется также глобальная переменная

$stdout
, именно в нее направляется весь вывод, формируемый методами из
Kernel
. Она инициализирована значением
STDOUT
, так что данные отправляются на стандартный вывод, как и следовало ожидать. В любой момент переменной
$stdout
можно присвоить другое значение, являющееся объектом
IO
.

diskfile = File.new("foofile","w")

puts "Привет..." # Выводится на stdout.

$stdout = diskfile

puts "Пока!" # Выводится в файл "foofile".

diskfile.close

$stdout = STDOUT # Восстановление исходного значения.

puts "Это все." # Выводится на stdout.

Помимо метода

gets
в модуле
Kernel
есть методы ввода
readline
и
readlines
. Первый аналогичен
gets
в том смысле, что возбуждает исключение
EOFError
при попытке читать за концом файла, а не просто возвращает
nil
. Последний эквивалентен методу
IO.readlines
(то есть считывает весь файл в память).

Откуда мы получаем ввод? Есть переменная

$stdin
, которая по умолчанию равна
STDIN
. Точно так же существует поток стандартного вывода для ошибок (
$stderr
, по умолчанию равен
STDERR
).

Еще имеется интересный глобальный объект

ARGF
, представляющий конкатенацию всех файлов, указанных в командной строке. Это не объект класса
File
, хотя и напоминает таковой. По умолчанию ввод связан именно с этим объектом, если в командной строке задан хотя бы один файл.

# Прочитать все файлы, а затем вывести их.

puts ARGF.read

# А при таком способе более экономно расходуется память:

while ! ARGF.eof?

 puts ARGF.readline

end

# Пример: ruby cat.rb file1 file2 file3

При чтении из стандартного ввода (

stdin
) методы
Kernel
не вызываются. Потому можно обойти (или не обходить)
ARGF
, как показано ниже:

# Прочитать строку из стандартного ввода.

str1 = STDIN.gets

# Прочитать строку из ARGF.

str2 = ARGF.gets

# А теперь снова из стандартного ввода.

str3 = STDIN.gets

10.1.8. Буферизованный и небуферизованный ввод/вывод

В некоторых случаях Ruby осуществляет буферизацию самостоятельно. Рассмотрим следующий фрагмент:

print "Привет... "

sleep 10

print "Пока!\n"

Если запустить эту программу, то вы увидите, что сообщения «Привет» и «Пока» появляются одновременно, после завершения

sleep
. При этом первое сообщение не завершается символом новой строки.

Это можно исправить, вызвав метод

flush
для опустошения буфера вывода. В данном случае вывод идет в поток
$defout
(подразумеваемый по умолчанию для всех методов
Kernel
, которые занимаются выводом). И поведение оказывается ожидаемым, то есть первое сообщение появляется раньше второго.

print "Привет... "

STDOUT.flush

sleep 10

print "Пока!\n"

Буферизацию можно отключить (или включить) методом

sync=
, а метод
sync
позволяет узнать текущее состояние.

buf_flag = $defout.sync # true

STDOUT.sync = false

buf_flag = STDOUT.sync # false

Есть еще по крайней мере один низкий уровень буферизации, который не виден. Если метод

getc
возвращает символ и продвигает вперед указатель файла или потока, то метод
ungetc
возвращает символ назад в поток.

ch = mystream.getc # ?А

mystream.ungetc(?C)

ch = mystream.getc # ?C

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

sync=false
не отключает ее. Во-вторых, вернуть в поток можно только один символ; при попытке вызвать метод
ungetc
несколько раз будет возвращен только символ, прочитанный последним. И, в-третьих, метод
ungetc
не работает для принципиально небуферизуемых операций (например,
sysread
).

10.1.9. Манипулирование правами владения и разрешениями на доступ к файлу

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

Для определения владельца и группы файла (это целые числа) класс

File::Stat
предоставляет методы экземпляра
uid
и
gid
:

data = File.stat("somefile")

owner_id = data.uid

group_id = data.gid

В классе

File::Stat
есть также метод экземпляра mode, который возвращает текущий набор разрешений для файла.

perms = File.stat("somefile").mode

В классе

File
имеется метод класса и экземпляра
chown
, позволяющий изменить идентификаторы владельца и группы. Метод класса принимает произвольное число файлов. Если идентификатор не нужно изменять, можно передать
nil
или -1.

Поделиться:
Популярные книги

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Леший

Северский Андрей
1. Леший в "Городе гоблинов"
Фантастика:
рпг
5.00
рейтинг книги
Леший

Сокрушитель

Поселягин Владимир Геннадьевич
3. Уникум
Фантастика:
боевая фантастика
5.60
рейтинг книги
Сокрушитель

Снайпер

Поселягин Владимир Геннадьевич
3. Жнец
Фантастика:
боевая фантастика
попаданцы
5.60
рейтинг книги
Снайпер

Сын Петра. Том 1. Бесенок

Ланцов Михаил Алексеевич
1. Сын Петра
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Сын Петра. Том 1. Бесенок

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Индульгенция 2. Без права на жизнь

Машуков Тимур
2. Темный сказ
Фантастика:
аниме
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Индульгенция 2. Без права на жизнь

Тихие ночи

Владимиров Денис
2. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Тихие ночи

Идеальный мир для Демонолога 9

Сапфир Олег
9. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Демонолога 9

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Древесный маг Орловского княжества 4

Павлов Игорь Васильевич
4. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 4