Ruby - как записать консольный ввод в файл - PullRequest
0 голосов
/ 05 февраля 2012

Я хочу написать простую программу, которая записывает консольный ввод в файл с указанным именем.

file_name = ARGV[0]
of = File.open(file_name, 'w')

while a = gets.chomp
  puts a
  of.puts a
end

# ruby ​​write_script.rb file_name.txt

возвращает: main: undefined method chomp for nil:NilClass (NoMethodError)

обновление:

file_name = ARGV[0]
File.open(file_name, 'w') do |file|
  while (a = gets)
    print a
    file.write a
  end
end

После выполнения этого кода - программа завершается при запуске и создается пустой файл.

Как правильно сделатьэто?

Ответы [ 5 ]

2 голосов
/ 05 февраля 2012

Я думаю, проблема в том, что puts делает что-то негласное. В частности, , если в качестве аргумента командной строки указано имя файла , gets читает следующую строку из этого файла (см. Эти документы Документы Ruby, Ядро: получает ).

Итак, если скрипт в одну строку:

puts gets

... вызывается с такими аргументами CLI, как этот ruby onelinescript.rb some_file.txt, он напечатает первую строку some_file.txt.

Проблема в вашем случае, я думаю, заключается в том, что вы сначала открываете файл из списка аргументов CLI для записи, а затем неявно пытаетесь открыть его для чтения с помощью gets, что не работает. Чтобы это исправить, вы должны явно указать объект ввода-вывода, который вы вызываете gets on:

file_name = ARGV[0]
of = File.open(file_name, 'w')

while a = STDIN.gets.chomp
  puts a
  of.puts a
end

P. S. Если я ошибаюсь, пожалуйста, не стесняйтесь указывать на это.

1 голос
/ 05 февраля 2012

Следующий код работает для меня:

begin
  File.open(ARGV.shift, 'w') do |f|
    while a = gets.chomp
      p a
      break if a == 'exit'
      f.puts a
    end
  end
rescue SignalException
  puts
  puts "#Completed#"
  exit
end

Следует отметить, что я использую ARG.shift вместо ARG[0], потому что при использовании последнего gets будет получать доступ ко всему, что в ARG, прежде чем перейти на STDIN.ARG.shift удаляет исходный аргумент.

0 голосов
/ 05 февраля 2012

Метод здесь chomp, который удаляет строку (взятую из stdin gets()) из завершающего символа новой строки \n.

0 голосов
/ 05 февраля 2012

Код:

file_name = ARGV[0]
of = File.open(file_name, 'w')

while a = STDIN.gets
  print a
  of.write a
end
of.close

Ваша проблема в том, что когда вы добираетесь до конца стандартного ввода, возвращается ноль.

0 голосов
/ 05 февраля 2012

Вы ошиблись chomp как chop в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...