我正在创建类似于Otherwise write the greatest or least of the buffer, and put the next element in the buffer
命令的内容。对行进行计数似乎可以正常工作,但是对字节进行计数始终返回0。输出似乎在“挂起”,就像在等待什么。
我意识到制作文件的方式(读取文件3次以上)不是执行此操作的最佳方法,但我只想一个简单实用的示例
wc
答案 0 :(得分:2)
您的问题是您打开了文件一次,读取了完整的文件,然后假定它将神奇地重置。
File
的位置为“指针”,以知道接下来要读取哪个字节。读取一个字节后,该位置将增加一个,因此下一个读取调用将读取下一个字节,而不是同一字节。
您可以在通话count_lines
,count_bytes
和count_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确保一切正常。