首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编解码程序

编解码程序
EN

Stack Overflow用户
提问于 2013-03-06 03:54:43
回答 2查看 162关注 0票数 1

我正在使用ruby编写一个简单的编码-解码程序。编码器工作正常,但是我不能让文件正确解码。它总是返回一个空白的文本文件,而不是一个解码得很好的文件。代码如下:

编码器,它工作得很好:

代码语言:javascript
复制
# 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

和解码器,完全搞砸了:

代码语言:javascript
复制
#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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-06 04:29:02

我看到的一个可能的问题是,如果$file包含一个通配符(*?),则此代码每次在循环中都会践踏$idea,从而导致只在$idea中读取最后一个文件

代码语言:javascript
复制
Dir[$file].each do |file_name|
  $idea = read.File($file)
end

相反,您可能希望用Dir循环包装所有内容,以便依次处理每个文件。

不要使用$globals,除非你知道你为什么需要它们。随意使用它们表明您不了解变量作用域,并且正在使用它们来解决代码中的错误。

我会重写代码,使其看起来更像:

代码语言:javascript
复制
# 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 }

和:

代码语言:javascript
复制
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,但它们都使用“二进制”模式,不能转换行尾。因此,在读取文本文件时最好使用" text“模式,因为这样Ruby就可以针对所使用的操作系统执行正确的操作。File.read返回由块返回的值,因此我可以将其赋给一个变量。

我建议不要盲目地将'.txt'指定给文件名。相反,请查看是否需要分配它。有时,在忙碌的打字过程中,我们忘记了我们不需要输入它,然后你就会试图读取或写入带有".txt.txt“扩展名的文件。

票数 0
EN

Stack Overflow用户

发布于 2013-03-06 04:28:48

给你举个例子,看看ruby是什么样子的:

代码语言:javascript
复制
# 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

和解码器

代码语言:javascript
复制
# 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15232890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档