迭代同一文件的行后,迭代文件的字节为空

时间:2019-04-24 11:29:35

标签: rust

我正在创建类似于Otherwise write the greatest or least of the buffer, and put the next element in the buffer命令的内容。对行进行计数似乎可以正常工作,但是对字节进行计数始终返回0。输出似乎在“挂起”,就像在等待什么。

我意识到制作文件的方式(读取文件3次以上)不是执行此操作的最佳方法,但我只想一个简单实用的示例

wc

1 个答案:

答案 0 :(得分:2)

您的问题是您打开了文件一次,读取了完整的文件,然后假定它将神奇地重置。

File的位置为“指针”,以知道接下来要读取哪个字节。读取一个字节后,该位置将增加一个,因此下一个读取调用将读取下一个字节,而不是同一字节。

您可以在通话count_linescount_bytescount_words之间使用File::seek来更改此位置。

use std::io::{Seek, SeekFrom};

fn main() {
    let arg = &std::env::args()
        .nth(1)
        .expect("No file operand found")
        .to_owned();
    let mut file = File::open(arg).expect("Unable to open file for reading");

    let lines = count_lines(&file);
    print!("{} ", lines);

    file.seek(SeekFrom::Start(0)).expect("Seek failed");
    let bytes = count_bytes(&file);
    println!("{}", bytes);

    file.seek(SeekFrom::Start(0)).expect("Seek failed");
    let words = count_words(&file);
    print!("{} ", words);
}

为进一步解决您的代码,它不被认为很“生锈”。您可以使用Iterator::count来简化手动计数。

fn count_lines(file: &File) -> u32 {
    BufReader::new(file).lines().count() as u32
}

fn count_bytes(file: &File) -> u32 {
    BufReader::new(file).bytes().count() as u32
}

count_words函数“挂起”的原因是因为您忽略了读取的字节数。当read_until到达EOF(文件末尾)时,它将返回0作为金额。您必须引入一个中断条件,例如

fn count_words(file: &File) -> u32 {
    let mut count: u32 = 0;

    let mut buf: Vec<u8> = Vec::new();
    let mut reader = BufReader::new(file);
    while let Ok(amount) = reader.read_until(b' ', &mut buf) {
        if amount == 0 {
            break
        }
        count += 1;
    }

    count
}

请注意,这不是真正正确的实现,因为"hello "(末尾两个空格)将为您提供2而不是1,但这取决于您修理。确保add some tests确保一切正常。