Ruby - 如何将控制台输入写入文件

时间:2012-02-04 20:41:51

标签: ruby

我想写一个简单的程序,它将控制台输入写入我输入名称的文件。

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 个答案:

答案 0 :(得分:2)

我认为,问题在于puts在幕后做了一些事情。具体来说,如果有文件名作为命令行参数gets将从该文件中读取下一行(请参阅这些文档Ruby docs, Kernel:gets)。

所以,如果是一行脚本:

puts gets
使用像ruby onelinescript.rb some_file.txt这样的CLI参数调用

...它将打印some_file.txt的第一行。

我认为,您的问题是,您首先从CLI参数列表中打开文件进行写入,然后隐式尝试打开它以便使用gets进行阅读,但这并不起作用。要解决此问题,您应该明确说明您在gets上调用的IO对象:

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

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

P上。 S.如果我错了,请不要犹豫,指出这一点。

答案 1 :(得分:1)

以下代码适用于我:

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 1}}。 ARG.shift删除了原始参数。

答案 2 :(得分:0)

您在代码中将chomp拼错为chop

答案 3 :(得分:0)

这里的方法是chomp,它从尾部换行符gets()中删除一个字符串(从\n取出stdin)。

答案 4 :(得分:0)

代码:

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

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

你的问题是,当你到达stdin的末尾时,返回nil。