我正在使用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 :(得分:0)
只是为了举例说明ideomatic ruby的样子:
# 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}"
答案 1 :(得分: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.read
和File.write
,但它们都使用“二进制”模式,它不会转换行结尾。由于这个原因,在阅读文本文件时最好使用“文本”模式,因为Ruby可以为正在使用的操作系统做正确的事情。 File.read
返回块返回的值,因此我可以将其分配给变量。
我建议不要盲目地为文件名分配'.txt'
。相反,看看是否需要分配。有时,在打字的热度下,我们忘记了不需要输入它,然后你会尝试读取或写入带有“.txt.txt”扩展名的文件。