2013-03-05 17 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