【问题标题】:Ruby read file_name with getsRuby 使用 get 读取文件名
【发布时间】:2021-10-17 14:15:15
【问题描述】:

我有一个初学者编码任务,第一步是我的程序“应该提示用户输入包含以下信息的文件的文件名:”已经有预制代码可以处理,“music_player.rb” (我必须在其中编写代码)和“albums.text”(这是我要读取的文件)

我知道a_file = File.new("mydata.txt", "r") 是从文件中读取。我正在尝试:

file_name = gets()
a_file = File.new("#{file_name}" , "r") # (line 13)

我总是出错

music_player_with_menu.rb:13:in `initialize': No such file or directory @ rb_sysopen - albums.txt (Errno::ENOENT) 

当我输入albums.txt。如果我只是删除gets 并拥有File.new("albums.txt" , "r") 它可以工作。我不确定我做错了什么。

【问题讨论】:

  • 如果您在gets 和尝试打开文件之间插入p filename 行,您可以看到Todd A. Jacobs 所描述的内容。此外,gets 返回一个字符串,因此您不需要 "#{...}" 构造,只需在 chomping 之后使用 File.new(file_name, "r")
  • 是的,他的回答帮助了我,我只需要使用 .chomp。我不确定是否需要编辑这篇文章或显示我的问题已得到解答的内容,我以前没有使用过 stackoverflow。
  • 您可以对您认为有助于理解的所有答案进行投票,但如果您认为某个特定答案可以帮助您解决问题,请单击它左侧的复选标记。这将其标记为“答案”。如果你想留下来,你也应该选择the tour,至少看看help center。欢迎登机!

标签: ruby file file-handling


【解决方案1】:

尝试从mydata.txt\n 读取将引发异常,除非文件名实际上以\n 结尾,这种情况很少发生。这是因为您正在使用 #gets,其中包括来自用户按 RETURNENTER 的换行符。

当您从 STDIN 读取时,您会得到一个行尾(例如,*nix 上的 \n 和 Windows 上的 \r\n)。因此,当您调用#gets 时,您几乎总是需要在结果上调用String#chomp

file_name = gets
#=> "foo\n"

file_name = gets.chomp
#=> "foo"

【讨论】:

  • @EugeneStanko 关键是当文件名实际上是 foo\n 时尝试读取 foo (不管你的操作系统如何在视觉上表示它)将正确地引发 Errno::ENOENT 因为你正在尝试读取目录中不存在的文件。 Q.E.D.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多