19 октября 2023 Rust


use std::io::{self, Write};

fn main() -> io::Result<()> {

    for (idx, line) in std::io::stdin().lines().enumerate() {
        match line {
            Ok(_line) => {
                let _cnt = _line.len();
                let _line = format!("{idx:>5}:[{_cnt:>3}] -> {_line}\n");
                let _ = io::stdout().write(_line.as_bytes());
            },
            Err(e) => println!("Error: {e}")
        };
    }

    Ok(())

}

Здесь интересным может показаться разворачивание итератора line с помощью конструкции match, так как в line может быть Ok("строка") или Err("ошибка"), то для использования необходимо развернуть

А так же вместо println используется запись в stdout


19 октября 2023 Rust stdin lines enumerate


use std::io;

fn main() -> io::Result<()> {

    for (idx, line) in std::io::stdin().lines().enumerate() {
        println!("Номер строки: {idx:>5} -> {}", line.unwrap() );
    }

    Ok(())
}

тут в цикле перебираются пронумерованные строки переданные на входящий канал

{idx:5}, указывает формированить вывод строк в блоке из 5 символов

cat src/main.rs | cargo r

    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/read_stdin`
Номер строки:     0 -> use std::io;
Номер строки:     1 -> 
Номер строки:     2 -> 
Номер строки:     3 -> 
Номер строки:     4 -> fn main() -> io::Result<()> {
Номер строки:     5 -> 
Номер строки:     6 ->     for (idx, line) in std::io::stdin().lines().enumerate() {
Номер строки:     7 ->         println!("Номер строки: {idx:>5} -> {}", line.unwrap() );
Номер строки:     8 ->     }
Номер строки:     9 -> 
Номер строки:    10 ->     Ok(())
Номер строки:    11 -> }

Тоже самое но на python

#!/usr/bin/env python
import sys

for idx, line in enumerate(sys.stdin.readlines()):
    print(f"Номер строки: {idx:>5} -> {line}", end='')