В 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
Нет, это не так. Работает ли моя версия для вас на OS X? (и ожидаете ли вы этого? Я довольно новичок в Rust) –
Ваш код действительно работает на OS X. Странно, потому что я уверен, что сделал это раньше в Windows Rust. Представленная мной версия немного более идиоматична, так как EOF обрабатывается итератором, поэтому вам нужно только подумать об «истинных» условиях ошибки. Если никто больше не перезвонит, я смогу добраться до моей виртуальной машины Windows через несколько часов ... – Shepmaster
@BenjaminLindley, ваша программа работает для меня на OS X. 'Ctrl-D' завершает ее. 'Ctrl-D' закрывает стандартный ввод, который заставляет' lines() 'возвращать' IoError' с 'ErrorKind :: EndOfFile', так что да, я бы ожидал, что этот код будет работать. –