есть ли черта для чтения из стандартного ввода или из файла в ржавчине? - PullRequest
0 голосов
/ 20 июня 2019

Как новичок в ржавчине, я хотел бы знать, есть ли способ использовать одну функцию / макрос / что-нибудь еще для чтения строки из переданного файла или из стандартного ввода, передавая в качестве аргумента своего рода буферный ридер?

Я не нашел ничего, что могло бы помочь, следующий код работает нормально, как только я смог обернуть некоторые проверки в макрос, я знаю, что код можно улучшить. Я открыт для предложений о том, как действительно улучшить этот макрос

...

macro_rules! validate {
    ($line:expr, $blank:expr, $squeeze:expr, $line_count:expr, $show_number:expr) => {
        if $line.len() <= 0 {
            $blank +=1;
        } else{
            $blank = 0;
        }
        if $squeeze & ($blank > 1) {
            continue;
        }
        if $show_number {
            $line_count += 1;
        }

    }
} 


...

for file in opt.files {
        blank_line_count = 0;
        line_count = 0;
        if file.to_str() != Some("-") {
            let f = File::open(file)?;
            for line in BufReader::new(f).lines() {
                let l = line.unwrap();
                validate!(l, blank_line_count, opt.squeeze_blank, line_count, opt.number); // will continue the loop if not valid
                println!("{}", format_line(l, opt.show_ends, opt.show_tabs, opt.show_nonprinting, line_count)); // will be skipped if not valid
            }
        } else {
            let stdin = io::stdin();
            let mut bytes_read: usize;
            loop {
                let mut line = String::new();
                bytes_read = stdin.lock().read_line(&mut line).expect("Could not read line");
                if bytes_read == 0 { break; }
                line.pop();
                validate!(line, blank_line_count, opt.squeeze_blank, line_count, opt.number);// will continue the loop if not valid
                println!("{}", format_line(line, opt.show_ends, opt.show_tabs, opt.show_nonprinting, line_count)); // will be skipped if not valid
            }
        }
    }
....

Как показано, File и stdin обрабатываются по-разному, но оба они в основном делают одно и то же, пробегая цикл в поисках правильной записи

1 Ответ

0 голосов
/ 20 июня 2019

спасибо @PeterHall, за то, что при чтении черты горит лампочка, я не понял, что могу передать stdin в BufReader, так что трюк:

 let stdin = io::stdin();
 for line in BufReader::new(stdin).lines() {
...

так же, как и тот:

let f = File::open(file)?;
for line in BufReader::new(f).lines() {

Это то, что я искал.

Спасибо, мил

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