Как прочитать файл из командной строки с помощью оператора <и прочитать пользовательский ввод после этого? - PullRequest
0 голосов
/ 22 апреля 2019

Я пишу программу, в которой я принимаю файл csv через оператор <в командной строке. После того, как я прочитал файл, я также хотел бы задать пользователям вопросы и попросить их ввести свой ответ через командную строку. Однако всякий раз, когда я запрашиваю ввод данных пользователем, моя программа сразу пропускает его. </p>

Когда я искал переполнение стека, я обнаружил, что это версия Python здесь , но это мне не очень помогает, поскольку методы явно разные.

Я читаю свой файл, используя $ 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 голосов
/ 23 апреля 2019

Это не имеет ничего общего с Ruby. Это особенность оболочки.

Файловый дескриптор подключен одновременно только к одному файлу. Файловый дескриптор 0 (стандартный ввод) может быть связан с файлом или с терминалом. Это не может быть связано с обоими.

Итак, то, что вы хотите, просто невозможно. И это не просто невозможно в Ruby, это принципиально невозможно по самой природе того, как работает перенаправление оболочки.

Если вы хотите изменить это, вы ничего не можете сделать в своей программе или в Ruby. Вам нужно изменить, как работает ваша оболочка.

0 голосов
/ 23 апреля 2019

Вы не можете прочитать оба файла и , введенные пользователем из stdin. Вы должны выбрать. Но так как вы хотите оба, как об этом:

Вместо того, чтобы передавать содержимое файла в stdin, передайте в скрипт только имя файла. Затем скрипт откроет и прочитает файл. И stdin будет доступен для взаимодействия с пользователем (через $stdin или STDIN).

Вот небольшая модификация вашего скрипта:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...