我想写一个简单的程序,它将控制台输入写入我输入名称的文件。
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
执行此代码后 - 程序在启动时终止,空文件创建。
这样做的正确方法是什么?
答案 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。