2012-02-04 94 views
0

我想编写一个简单的程序,将控制台输入写入到输入名称的文件中。Ruby - 如何将控制台输入写入文件

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

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

#红宝石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 

执行此代码之后 - 程序终止在启动和空文件创建。

什么是正确的做法?

回答

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 

应当注意使用后者gets时,因为将访问无论是在ARG移动的STDIN之前,我使用的ARG.shift代替ARG[0]ARG.shift删除原始参数。

+0

美丽的解决方案,只是我有ctr-c的问题。谢谢) – 2012-02-04 21:35:44

+0

但是ctr-c,puts:**错误得到:中断** – 2012-02-04 21:47:42

+1

这是正常的,因为通过中断你抛出一个错误。如果你想要一个干净的完成,即使使用ctr-c,你也需要捕获这个错误。我更新了上面的代码来捕捉它。 – 2012-02-04 22:01:57

0

在代码中拼写错误chompchop

+0

好的,谢谢,但这不是主要问题 – 2012-02-04 20:44:05

0

这里的方法是chomp,它从尾随的换行符\n中去掉一个字符串(取自标准输入gets())。

0

代码:

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

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

你的问题是,得到当你到标准输入的结尾,则返回零。

+0

对不起,我的iPhone完全无法正确格式化代码,我不知道为什么。 – 2012-02-04 21:01:35

+0

感谢您的回答,但是我用** ruby​​ write_script.rb file_name执行该代码后,我自己尝试了这一点。txt **程序终止并清空文件** file_name.txt **创建 – 2012-02-04 21:08:24

+0

注意:您必须在程序结束时关闭该文件!最好使用File.open的块形式(请参阅我的答案)。 – Phrogz 2012-02-04 21:14:57

2

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

所以,如果一个行脚本:

puts gets 

...被调用与CLI参数这样ruby onelinescript.rb some_file.txt,将打印的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.如果我错了,请不要犹豫,指出这一点。

+0

谢谢你,这似乎是真的 – 2012-02-04 21:34:19