2013-03-05 15 views
1

我正在使用ruby编写一个简单的编码解码程序。编码器工作正常,但是,我无法正确解码文件。它总是返回一个空白文本文件而不是一个很好解码的文件。 下面的代码:编码解码程序

编码器,它工作得很好:

# Get evil idea and encode 
print "Enter your diabolical scheme: " 
$idea = gets 
$encode1 = $idea.reverse 
$encode2 = $encode1.capitalize 

print $encode2 
print" 
" 

#Save the jibberish to a new file 
print " 
File encoded. Please enter a name for this idea: " 
idea_name = gets.strip 
File::open("idea-" + idea_name + ".txt", "w") do |f| 
    f << $encode2 
end 

和解码器,这是完全搞砸了:

#Get file to decode 
print 'Name of file to decode:' 
$name = gets 
$file = $name << '.txt' 
Dir[$file].each do |file_name| 
    $idea = read.File($file) 
end 


# Print each idea out with the words fixed 

$decode1 = $idea.to_s() 
$decode2 = $decode1.reverse() 
$decode3 = $decode2.capitalize() 

print $decode3 

#Save decoded file to new location 
print " 
File decoded. Please enter a new name for this idea: " 
idea_name = gets.strip 
File::open(idea_name + ".txt", "w") do |f| 
    f << $decode3 
end 

如何使解码器正确解码的文本?

+0

只是好奇,你为什么要把所有的变量都加上$?我从来没有见过用Ruby代码做过的事情。 – 2013-03-05 19:57:02

+0

$ variable是一个全局变量,与@instance变量或@@ class变量相反,对吗?这就是我被教导的方式。 – 2013-03-05 19:59:40

+0

啊,你说得对。今天学到了新东西。 – 2013-03-05 20:00:54

回答

0

一个可能的问题,我看到的是,如果$file包括一个通配符(*?)此代码在每次通过循环时踩在$idea上,导致只读取最后一个文件在$idea中:

Dir[$file].each do |file_name| 
    $idea = read.File($file) 
end 

相反,您可能想要用Dir循环包装所有内容,以便每个文件都可以依次处理。

不要使用$globals,直到你知道你为什么需要它们。使用它们无处不在显示你不理解变量作用域并且正在使用它们来解决代码中的错误。

我重写代码看起来更像:

# Get evil idea and encode 
print 'Enter your diabolical scheme: ' 

encode2 = gets.strip.reverse.capitalize 
puts encode2 

# Save the jibberish to a new file 
print ['', 'File encoded. Please enter a name for this idea: '].join("\n") 
idea_name = gets.strip 
idea_name += '.txt' unless idea_name[/\.txt$/i] 
File.open("idea-#{ idea_name }", 'w') { |fo| fo.puts encode2 } 

和:

print 'Name of file to decode: ' 
name = gets.strip 
name += '.txt' unless name[/\.txt$/i] 

Dir[name].each do |fn| 

    idea = File.open(fn, 'r') { |fi| fi.read } 

    # Print each idea out with the words fixed 
    decode3 = idea.reverse().capitalize() 
    puts decode3 

    # Save decoded file to new location 
    print ['', 'File decoded. Please enter a new name for this idea: '].join("\n") 
    idea_name = gets.strip 
    idea_name += '.txt' unless idea_name[/\.txt$/i] 
    File::open(idea_name, 'w') { |fo| fo.puts decode3 } 

end 

我可以用File.readFile.write,但它们都使用 “二进制” 模式,没有按不会翻译行结尾。出于这个原因,在阅读文本文件时最好使用“文本”模式,因为那样Ruby可以为正在使用的操作系统做正确的事情。 File.read返回块返回的值,所以我可以将它分配给一个变量。

我建议不要盲目地将'.txt'分配给文件名。相反,看看是否需要分配。有时候,在打字时,我们忘记我们不需要需要输入它,然后你会试图读取或写入带有“.txt.txt”扩展名的文件。

0

只是给你如何ideomatic红宝石看起来像一个例子:

# encoder.rb 
puts "Enter your diabolical scheme: " 

encoded = gets.chomp.reverse.capitalize 

puts encoded 

puts "File encoded." 
puts "Please enter a name for this idea: " 
name = gets.chomp 

File.open("idea-#{name}.txt", "w") do |file| 
    file << encoded 
end 

和解码器

# decoder.rb 
puts "Name of file to decode:" 
name = gets.chomp 
encoded = File.readlines("idea-#{name}.txt").first.chomp 

idea = encoded.downcase.reverse 
puts "the idea was #{idea}" 
+0

因为您正在使用'readlines',所以代码将只返回'encoded'中读取的第一行。 – 2013-03-05 20:35:59

+0

。这只是一个例子。 – phoet 2013-03-06 09:57:54