如果找不到stdin,如何从stdin或文件中获取输入?

卡姆登·纳兹特(Camden Narzt)

我正在将一些Python移植到Rust作为学习练习,并且需要从文件或标准输入中获取输入。我将输入句柄保留在一个结构中,所以我以为自己会做一个Box<io::Read>输入,但是遇到了需要寻找输入项而seek不是Read特征的一部分的情况我知道您无法在管道中搜索,因此我现在继续假设该方法仅在输入是文件时才被调用,但是我的问题是我无法在Rust中对其进行检查和下调。

我知道我可以为两种输入类型使用一个枚举,但是似乎应该有一种更优雅的方式来做到这一点。这就是我的问题,您如何做到这一点而又不会一团糟?

是否可以将stdin或文件包装在相同类型的缓冲区中,以便我可以仅使用该类型,而不必担心IO的类型?

卢卡斯·卡尔伯特(Lukas Kalbertodt)

我知道,你说你想要的东西更优雅和不枚举,但我认为枚举的解决方案相当优雅。因此,这是一种尝试:

use std::fs;
use std::io::{self, Read, Seek, SeekFrom};

enum Input {
    File(fs::File),
    Stdin(io::Stdin),
}

impl Read for Input {
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
        match *self {
            Input::File(ref mut file) => file.read(buf),
            Input::Stdin(ref mut stdin) => stdin.read(buf),
        }
    }
}

impl Seek for Input {
    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
        match *self {
            Input::File(ref mut file) => file.seek(pos),
            Input::Stdin(_) => {
                Err(io::Error::new(
                    io::ErrorKind::Other, 
                    "not supported by stdin-input",
                ))
            },
        }
    }
}

将这样的代码放在您的某个子模块中,不必再担心太多了。您可以Input像使用a一样使用类型的对象File:无论如何,您都必须处理查找错误,因此处理stdin无法查找的问题应该非常容易。一个例子:

let arg = std::env::args().nth(1).unwrap();
let mut input = if arg == "--" {
    Input::Stdin(io::stdin())
} else {
    Input::File(fs::File::open(&arg).expect("I should handle that.."))
};

let mut v = Vec::new();
let _idc = input.read_to_end(&mut v);

match input.seek(SeekFrom::End(0)) {
    Err(_) => println!("oh noes :("),
    Ok(bytes) => println!("yeah, input is {} long", bytes),
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果找不到stdin,如何从stdin或文件中获取输入?

来自分类Dev

如何匹配文本文件中的输入然后如果找不到则循环?

来自分类Dev

DLL加载失败:找不到指定的模块。<模块>中第1行的文件“ <stdin>”

来自分类Dev

如何使用 process.stdin 在 nodejs 中获取用户输入以获取 Hackerearth 代码

来自分类Dev

不输入该如何输入Golang中Stdin的输入字段?

来自分类Dev

在日食中获取STDIN?

来自分类Dev

如何从C中具有领先空格的stdin获取字符串输入?

来自分类Dev

如何使用stdin将用户输入值获取到列表

来自分类Dev

如何使用 stdin 和 stdout 获取输入并显示它们的总和

来自分类Dev

如何在python中通过sys.stdin输入文件路径?

来自分类Dev

如何让tar读取stdin的输入?

来自分类Dev

如何让tar读取stdin的输入?

来自分类Dev

Python:如何确保程序仅从sys.stdin中获取文件数据?

来自分类Dev

如何测试stdin在julia中是否有可用的输入?

来自分类Dev

如何在 shell 中检查正确数量的 STDIN 用户输入?

来自分类Dev

从sys.stdin获取输入,非阻塞

来自分类Dev

在Swift中使用NSInputStream从STDIN获取输入

来自分类Dev

在python3中,如果输入是dir,如何使for循环获取所有文件,如果输入是文件,则如何选择文件

来自分类Dev

如果在Android中找不到Dynamodb,如何获取getitem

来自分类Dev

找不到构建输入文件:如何更改文件[xcode]的路径

来自分类Dev

Tornado:如果在 StaticFileHandler 中找不到,如何发送默认文件

来自分类Dev

如何在C中读取通过stdin传递的文件

来自分类Dev

如果找不到已被重写的文件,我该如何重写

来自分类Dev

如果包含找不到文件,如何回显错误消息

来自分类Dev

如果找不到文件,如何跳过代码块?

来自分类Dev

如果找不到文件,则强制Excel中的外部链接断开

来自分类Dev

开始-如何增加最大Stdin输入长度?

来自分类Dev

stdin被占用时如何提示输入?

来自分类Dev

来自STDIN在Light Table Juno中的输入

Related 相关文章

  1. 1

    如果找不到stdin,如何从stdin或文件中获取输入?

  2. 2

    如何匹配文本文件中的输入然后如果找不到则循环?

  3. 3

    DLL加载失败:找不到指定的模块。<模块>中第1行的文件“ <stdin>”

  4. 4

    如何使用 process.stdin 在 nodejs 中获取用户输入以获取 Hackerearth 代码

  5. 5

    不输入该如何输入Golang中Stdin的输入字段?

  6. 6

    在日食中获取STDIN?

  7. 7

    如何从C中具有领先空格的stdin获取字符串输入?

  8. 8

    如何使用stdin将用户输入值获取到列表

  9. 9

    如何使用 stdin 和 stdout 获取输入并显示它们的总和

  10. 10

    如何在python中通过sys.stdin输入文件路径?

  11. 11

    如何让tar读取stdin的输入?

  12. 12

    如何让tar读取stdin的输入?

  13. 13

    Python:如何确保程序仅从sys.stdin中获取文件数据?

  14. 14

    如何测试stdin在julia中是否有可用的输入?

  15. 15

    如何在 shell 中检查正确数量的 STDIN 用户输入?

  16. 16

    从sys.stdin获取输入,非阻塞

  17. 17

    在Swift中使用NSInputStream从STDIN获取输入

  18. 18

    在python3中,如果输入是dir,如何使for循环获取所有文件,如果输入是文件,则如何选择文件

  19. 19

    如果在Android中找不到Dynamodb,如何获取getitem

  20. 20

    找不到构建输入文件:如何更改文件[xcode]的路径

  21. 21

    Tornado:如果在 StaticFileHandler 中找不到,如何发送默认文件

  22. 22

    如何在C中读取通过stdin传递的文件

  23. 23

    如果找不到已被重写的文件,我该如何重写

  24. 24

    如果包含找不到文件,如何回显错误消息

  25. 25

    如果找不到文件,如何跳过代码块?

  26. 26

    如果找不到文件,则强制Excel中的外部链接断开

  27. 27

    开始-如何增加最大Stdin输入长度?

  28. 28

    stdin被占用时如何提示输入?

  29. 29

    来自STDIN在Light Table Juno中的输入

热门标签

归档