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

考えられる問題の 1 つ$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 は使用している OS に対して適切な処理を行うことができます。File.readブロックから返された値を返すので、それを変数に割り当てることができます。

'.txt'ファイル名にやみくもに割り当てないことをお勧めします。代わりに、割り当てる必要があるかどうかを確認してください。ときどき、入力の熱で、入力する必要がないことを忘れてしまい、".txt.txt" 拡張子の付いたファイルを読み書きしようとすることがあります。

于 2013-03-05T20:29:01.983 に答える
0

観念的なルビがどのように見えるかの例を示すだけです:

# 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 に答える