#ruby
#рубиновый
Вопрос:
У меня уже есть одна строка, fd.txt
и когда я вставляю три несколько строк, первая строка добавляется сразу после существующих данных. Вот один из примеров:
fd.txt
This is past data.
Новые данные
Line 1
Line 2
Line 3
Когда я запускаю следующий код:
open('fd.txt', 'a ') { |file|
file.puts "Line 1"
file.puts "Line 2"
file.puts "Line 3"
}
Я получаю следующий вывод:
This is past data.Line 1
Line 2
Line 3
Но мне нужно Line 1
из второй строки. Поэтому я добавляю "n"
, file.puts "nLine 1"
но это добавляет дополнительную пустую строку прямо перед Line 1
этим . Какое обновление я должен внести в свой код, чтобы получить следующий результат:
This is past data.
Line 1
Line 2
Line 3
Комментарии:
1. но это добавляет дополнительную пустую строку прямо перед строкой 1 — Нет, это не так. На мой взгляд, мое предположение о том, что здесь произошло, заключается в том, что вы повторно сохранили
fd.txt
, и ваш текстовый редактор настроен на добавление новой строки в конец файла, если таковой отсутствует. Это часто считается стандартной практикой.
Ответ №1:
Не очень элегантно, но вы могли бы проверить, является ли последний символ символом a n
, и добавить его в противном случае: (я предполагаю, что вы не знаете, заканчивается ли файл новой строкой)
open('fd.txt', 'a ') do |file|
file.puts unless file.pread(1, file.size - 1) == "n"
file.puts "Line 1"
file.puts "Line 2"
file.puts "Line 3"
end
Конечно, было бы лучше, чтобы в первую очередь не было пропущенной новой строки.
Комментарии:
1. Жаль
IO#pread
, что это не позволяетfile.pread(1, -1) == "n"
.2. @CarySwoveland это было первое, что я попробовал!
Ответ №2:
Аналогично другому предложенному ответу, вы могли бы сделать:
open('fd.txt', 'a ') do |file|
file.seek(-1, IO::SEEK_END)
file.puts unless file.read == "n"
file.puts "Line 1"
file.puts "Line 2"
file.puts "Line 3"
end