Книга: Программирование на языке Ruby
10.1.7. Простой ввод/вывод
10.1.7. Простой ввод/вывод
Вы уже знакомы с некоторыми методами ввода/вывода из модуля Kernel
; мы вызывали их без указания вызывающего объекта. К ним относятся функции gets
и puts
, а также print
, printf
и p (последний вызывает метод объекта inspect
, чтобы распечатать его в понятном для нас виде).
Но есть и другие методы, которые следует упомянуть для полноты. Метод putc
выводит один символ. (Парный метод getc
не реализован в модуле Kernel
по техническим причинам, однако он есть у любого объекта класса IO
). Если параметром является объект String
, то печатается первый символ строки.
putc(?n) # Вывести символ новой строки.
putc("X") # Вывести букву X.
Интересный вопрос: куда направляется вывод, если эти методы вызываются без указания объекта? Начнем с того, что в среде исполнения Ruby определены три глобальные константы, соответствующие трем стандартным потокам ввода/вывода, к которым мы привыкли в UNIX. Это STDIN
, STDOUT
и STDERR
. Все они имеют тип IO
.
Имеется также глобальная переменная $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.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. Поиск файлов и каталогов
- Практическая работа 38. Создание простой таблицы
- Практическая работа 44. Создание простой таблицы с формулами
- Простой пример
- Листинг 15.1. Простой код файлового ввода-вывода, иллюстрирующий различия между локальной и удаленной передачей данных
- 10.1.7. Простой ввод
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- 1.6 Драйверы и буферы ввода-вывода
- 1.8 Ввод-вывод типичного приложения хранения данных
- Глава 6 BIOS – базовая система ввода-вывода
- 5.2.2.2. Устройства ввода информации в персональный компьютер
- Можно ли входить в систему без ввода имени и пароля?