Rust 13: 命令行参数std::env::args()和标准输入std::io::stdin()

命令行参数

今天来简单说一说Rust中如何获取程序的入口参数,以及如何读取标准输入的问题。

创建测试项目

cargo new hello-cli

编辑src/main.rs,其中通过静态的std::env::args()函数调用得到程序的入口参数:

fn main() {
    use std::env::Args;
    let args: Args = std::env::args();

    println!("{:?}", args);
    for arg in args {
        println!("{:?}", arg);
    }
}

运行测试

在这里插入图片描述

可以看到,通过for arg in args遍历程序入口参数,第一个参数就是程序的路径

标准输入输出

标准输入

调用std::io::stdin()得到的Stdin关联到程序的标准输入设备。

Stdinread_line()方法,一次从标准输入读取一行内容,包括换行符

Stdin中实现了Read trait中的read_to_string()方法。调用该方法会一直读到文件末尾(EOF)才结束。
要在CLI命令行输入EOFWindows系统是CTRL+Z,Linux是CTRL+D

标准输出

可通过println!宏,将格式化后的字符串输出到标准输出设备。

// 调用标准输入读取输入信息
use std::io::Read;
use std::io::Stdin;
let mut buf = String::new();
let std_in: Stdin = std::io::stdin();
while std_in.read_line(&mut buf).is_ok() {
    if "exit\r\n" == buf {
        println!("Bye bye");
        break;
    } else {
        print!("{}", buf);
        buf.clear();
    }
}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Unix系统中,进程通常使用管道(pipe)进行通信。在Rust中,可以使用std::os::unix::io::pipe模块来创建管道。以下是一个简单的示例: ```rust use std::os::unix::io::{RawFd, AsRawFd}; use std::io::{Read, Write}; use std::process::{Command, Stdio}; fn main() { let (mut reader, mut writer) = unsafe { std::os::unix::io::pipe().unwrap() }; let mut child = Command::new("cat") .stdin(Stdio::from_raw_fd(reader.as_raw_fd())) .stdout(Stdio::piped()) .spawn() .unwrap(); let message = "Hello, world!\n"; writer.write_all(message.as_bytes()).unwrap(); writer.flush().unwrap(); let mut buf = [0; 128]; reader.read(&mut buf).unwrap(); println!("Received: {}", String::from_utf8_lossy(&buf)); child.wait().unwrap(); } ``` 在这个例子中,我们首先使用`std::os::unix::io::pipe()`创建了一个管道,返回值是一个元组,其中第一个元素是读取端的文件描述符,第二个元素是写入端的文件描述符。注意,在使用这个函数时,需要使用`unsafe`关键字来标记。 然后,我们使用`Command`模块创建了一个子进程,将读取端的文件描述符作为子进程的标准输入,并将子进程的标准输出重定向到管道的写入端。这样,子进程就可以从管道中读取数据,并将处理结果写入到管道中。 接下来,我们向管道中写入了一条消息,并从管道中读取了子进程的处理结果。最后,我们等待子进程结束。 需要注意的是,使用管道通信时,需要注意数据的传输顺序。在本例中,我们首先向管道中写入数据,再从管道中读取子进程的处理结果。如果顺序颠倒,就会导致程序死锁或出现其他问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值