我正在使用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如何让解码器正确解码文本?
发布于 2013-03-06 04:29:02
我看到的一个可能的问题是,如果$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,但它们都使用“二进制”模式,不能转换行尾。因此,在读取文本文件时最好使用" text“模式,因为这样Ruby就可以针对所使用的操作系统执行正确的操作。File.read返回由块返回的值,因此我可以将其赋给一个变量。
我建议不要盲目地将'.txt'指定给文件名。相反,请查看是否需要分配它。有时,在忙碌的打字过程中,我们忘记了我们不需要输入它,然后你就会试图读取或写入带有".txt.txt“扩展名的文件。
发布于 2013-03-06 04:28:48
给你举个例子,看看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}"https://stackoverflow.com/questions/15232890
复制相似问题