Работа с файлами
Ввод данных с клавиатуры в процессе выполнения программы удобен только в случае небольших объемов. В других ситуациях необходимо чтение информации из заранее подготовленного файла.
Для работы с файлом при помощи метода new создается экземпляр класса File. Обязательным аргументом этого метода является строка, содержащая имя файла, например,
f = File.new("myfile.txt")
Другим (необязательным) аргументом является задание режима работы с файлом. По умолчанию этот параметр имеет значение "r", что соответствует режиму "только чтение". Если требуется открыть файл с возможностью записи в него, то следует указать параметр "w", например,
f1 = File.new("newfile.txt", "w")
Метод readlines считывает весь файл, создает массив и размещает каждую прочитанную строку в отдельном элементе массива При дальнейшей обработке полученного массива удобно использовать метод each.
Для вывода строки в выходной поток (в файл или на экран монитора) используется метод write, например,
a = "Hello, world!" f1.write(a)
Задача
Имеется текстовый файл fio.txt, содержащий список фамилий, имен и отчеств учащихся. При этом каждая строка файла содержит данные только об одном человеке, например,
Петров Сергей Васильевич Сидорова Ольга Петровна Иванова Марья Даниловна
Напишите программу, которая читает информацию из файла и
- печатает пронумерованный список учеников;
- печатает пронумерованный список фамилий и инициалов.
Решение 1
f = File.new("fio.txt") n = 1 student = f.readlines student.each{ |i| print n, ". ", i n += 1 }
Отметим, что программа должна располагаться в той же директории, что и файл с данными. В противном случае необходимо указывать полный путь к этому файлу.
Для получения инициалов каждую строку полученного массива преобразуем в массив, элементами которого будут фамилия, имя и отчество. Затем фамилию печатаем полностью, а вместо следующих элементов массива - только их первый символ. Для преобразования строки в массив используется ранее рассмотренная функция split. Напомним, что параметром по умолчанию этой функции является пробел.
Решение 2
f = File.new("fio.txt") n = 1 student = f.readlines student.each{ |i| i.chop! fio = i.split print n, ". ", fio[0], " ", fio[0][0].chr, ". ", fio[1][0].chr, ".\n" n += 1 }
Пример 1.14.
(html, txt)