如何使用<运算符从命令行读取文件并随后读取用户输入?

时间:2019-04-22 19:57:29

标签: ruby command-line

我正在编写一个程序,在其中我通过命令行中的<运算符来获取一个csv文件。读完文件后,我还要询问用户问题,并让他们通过命令行输入响应。但是,每当我要求用户输入时,我的程序都会跳过它。

当我搜索堆栈溢出时,我发现似乎是python版本here,但这对我没有帮助,因为方法明显不同。

我使用$ stdin.read读取了文件。而且我尝试使用常规的get,STDIN.gets和$ stdin.gets。但是,程序始终会跳过它们。

样本输入ruby ./bin/kata < items.csv 当前文件

require 'csv'

n = $stdin.read
arr = CSV.parse(n)
input = ''
while true
  puts "What is your choice: "
  input = $stdin.gets.to_i
  if input.zero?
    break
  end
end

我的预期结果是在命令中显示What is your choice:并等待用户输入。但是,我正在无限循环地反复显示该短语。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

您不能同时从标准输入中读取文件用户输入。您必须选择。但是既然两者都想要,那怎么办呢?

与其传递文件内容到stdin,不如将文件名传递给脚本。然后,脚本将打开并读取文件。并且stdin将可用于与用户互动(通过$stdinSTDIN)。

这是对脚本的较小修改:

arr = CSV.parse(ARGF) # the important part. 
input = ''
while true
  puts "What is your choice: "
  input = STDIN.gets.to_i
  if input.zero?
    break
  end
end

您可以这样称呼它:

ruby ./bin/kata items.csv

您可以在文档中进一步了解ARGF:https://ruby-doc.org/core-2.6/ARGF.html

答案 1 :(得分:0)

这与Ruby无关。这是外壳的功能。

文件描述符可以随时连接到一个文件。文件描述符0(标准输入)可以连接到文件,也可以连接到终端。它不能同时连接到两者。

因此,根本无法实现您想要的。而且,不仅在Ruby中不可能,而且由于外壳重定向的工作原理,根本是不可能的。

如果要更改此设置,则无法在程序或Ruby中执行任何操作。您需要修改外壳的工作方式。