2015-01-16 6 views
1

В C++, я могу читать из стандартного ввода, как это:Как завершить стандартный ввод?

while (std::getline(std::cin, line)) 
    process(line); 

, когда я ввести Ctrl + Z (Windows), он завершает стандартный ввод, и цикл заканчивается. Я могу сделать что-то подобное на других языках.

Я попытался перевести идиому к ржавчине, и я пришел с этим:

use std::io; 

fn main() { 
    loop { 
     match io::stdin().read_line() { 
      Ok(line) => process(line), 
      Err(_) => break, 
     } 
    } 
} 

fn process(x: String) { 
    println!("{:?}", x.as_bytes()); 
} 

Однако, когда я Ctrl + Z, при выполнении этого кода, он не идет к делу Err. Он просто обрабатывает линию как Ok. Предоставление строки с 3 символами, символом SUB (0x1A), а затем CRLF ("\r\n").

Итак, как я могу завершить стандартный ввод и вызвать ошибку read_line? Вернее, как я могу определить запрос на прерывание стандартного ввода? Я могу проверить символ SUB, но это не переносимо, так как это был бы другой символ (например, EOT) в других системах.

Редактировать

Существует открытая проблема для этого на GitHub репо. Issue #19914

ответ

0

Я не моя ОС Windows VM под рукой, чтобы проверить это, но он работает на OS X (с использованием Ctrl - D). Это работает в вашем случае:

use std::io::stdin; 

fn process(a: &str) {} 

fn main() { 
    for line in stdin().lock().lines() { 
     match line { 
      Ok(line) => process(&*line), 
      Err(e) => panic!("{}", e), 
     } 
    } 
} 
+0

Нет, это не так. Работает ли моя версия для вас на OS X? (и ожидаете ли вы этого? Я довольно новичок в Rust) –

+0

Ваш код действительно работает на OS X. Странно, потому что я уверен, что сделал это раньше в Windows Rust. Представленная мной версия немного более идиоматична, так как EOF обрабатывается итератором, поэтому вам нужно только подумать об «истинных» условиях ошибки. Если никто больше не перезвонит, я смогу добраться до моей виртуальной машины Windows через несколько часов ... – Shepmaster

+0

@BenjaminLindley, ваша программа работает для меня на OS X. 'Ctrl-D' завершает ее. 'Ctrl-D' закрывает стандартный ввод, который заставляет' lines() 'возвращать' IoError' с 'ErrorKind :: EndOfFile', так что да, я бы ожидал, что этот код будет работать. –

Смежные вопросы