Тексты в файле не печатаются должным образом

Работая над этой проблемой, я набрал код ТОЧНО, как в состоянии проблемы - даже пытался скопировать и вставить, чтобы увидеть, было ли это что-то, что я делал неправильно, но это не так.

Код, который у меня есть, находится внизу этого поста. Я отправляю аргумент 'test.txt', который содержит:

This is stuff I typed into a file. 
It is really cool stuff. 
Lots and lots of fun to have in here

тем не менее, когда я запускаю код, во время print_all (current_file) он ТОЛЬКО печатает "очень и очень весело, чтобы иметь здесь". - которая является последней строкой файла.

И там, где предполагается распечатывать каждую отдельную строку, она печатает:

1 ["This is stuff I typed into a file. \rIt is really cool stuff. \rLots and lots of fun to have in here.\r\r"]
2 []
3 []'

по сути, захватывает все строки как 1 строку и ничего не печатает там, где предполагается печатать строки 2 и 3.

Есть идеи?

input_file = ARGV[0]

def print_all(f)
  puts f.read()
end

def rewind(f)
  f.seek(0, IO::SEEK_SET)
end

def print_a_line(line_count, f)
  puts "#{line_count} #{f.readlines()}"
end

current_file = File.open(input_file)

puts "First let's print the whole file:"
puts # a blank line

print_all(current_file)

puts "Now let's rewind, kind of like a tape."

rewind(current_file)

puts "Let's print three lines:"

current_line = 1
print_a_line(current_line, current_file)

current_line += 1
print_a_line(current_line, current_file)

current_line += 1
print_a_line(current_line, current_file)

1 ответ

Решение

РЕДАКТИРОВАТЬ: похоже, что тестовый файл, который вы используете, содержит только символ \r указывать новую строку вместо окон \r\n или Linux \n, Ваш текстовый редактор может интерпретировать \r как новая строка, но рубин нет.

Оригинальный ответ:

Что касается первой проблемы с print_all Я не мог воспроизвести это. Как вы запускаете скрипт?

Во второй задаче вы используете метод file.readlines() (обратите внимание на последние с) вместо file.readline(),

file.readlines() читает весь файл и возвращает его содержимое в массиве, где каждая строка является элементом массива. Вот почему вы получаете весь файл при первом вызове. Последующие вызовы возвращают пустой массив, потому что вы - конец файла (вам нужно "перемотать", как вы делали это ранее, чтобы продолжить чтение из файла).

file.readline() читает одну строку файла и возвращает его содержимое в виде строки, что, вероятно, то, что вы хотите.

Я связался с рубиновой документацией для дальнейшего чтения (без каламбура) по этому вопросу. Обратите внимание, что соответствующие методы подробно описаны в документации для IO класс, так как File наследуется от этого класса, а методы readlines/readline наследуются от IO,

Другие вопросы по тегам