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

на главную

Жанры

Программирование на языке 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.

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

Я не царь. Книга XXIV

Дрейк Сириус
24. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не царь. Книга XXIV

Личинка

Привалов Сергей
1. Звездный Бродяга
Фантастика:
боевая фантастика
космическая фантастика
рпг
попаданцы
5.00
рейтинг книги
Личинка

Ваше Сиятельство 4т

Моури Эрли
4. Ваше Сиятельство
Любовные романы:
эро литература
5.00
рейтинг книги
Ваше Сиятельство 4т

Противостояние

Гаевский Михаил
2. Стратег
Фантастика:
боевая фантастика
космическая фантастика
5.25
рейтинг книги
Противостояние

Моров. Том 7

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

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

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

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

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Чужак из ниоткуда 4

Евтушенко Алексей Анатольевич
4. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 4

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Последний Герой. Том 2

Дамиров Рафаэль
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Последний Герой. Том 2

На цепи

Уваров
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
На цепи