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

如何让解码器正确解码文本?

4

2 回答 2

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}"
于 2013-03-05T20:28:48.423 回答
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.readand File.write,但它们都使用“二进制”模式,它不会翻译行尾。出于这个原因,在读取文本文件时最好使用“文本”模式,因为这样 Ruby 可以为正在使用的操作系统做正确的事情。File.read返回块返回的值,所以我可以将它分配给一个变量。

我建议不要盲目分配'.txt'文件名。相反,请查看是否需要分配它。有时,在打字的热度中,我们忘记了我们不需要输入它,然后您会尝试读取或写入带有“.txt.txt”扩展名的文件。

于 2013-03-05T20:29:01.983 回答