Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在迭代同一文件的行之后,迭代文件的字节是空的_Rust - Fatal编程技术网

Rust 在迭代同一文件的行之后,迭代文件的字节是空的

Rust 在迭代同一文件的行之后,迭代文件的字节是空的,rust,Rust,我正在创建类似于wc命令的东西。计数行似乎工作正常,但计数字节总是返回0。数词也不起作用;输出似乎“挂起”,好像在等待什么 我意识到它的制作方式(将文件读3遍)并不是实现这一点的最佳方式,但我只想要一个简单有效的示例 使用std::fs::File; 使用std::io::{BufRead,BufReader,Read}; fn main(){ 设arg=&std::env::args() .nth(1) .expect(“未找到文件操作数”) .to_owned(); let file=fil

我正在创建类似于
wc
命令的东西。计数行似乎工作正常,但计数字节总是返回0。数词也不起作用;输出似乎“挂起”,好像在等待什么

我意识到它的制作方式(将文件读3遍)并不是实现这一点的最佳方式,但我只想要一个简单有效的示例

使用std::fs::File;
使用std::io::{BufRead,BufReader,Read};
fn main(){
设arg=&std::env::args()
.nth(1)
.expect(“未找到文件操作数”)
.to_owned();
let file=file::open(arg).expect(“无法打开文件进行读取”);
let lines=计数行(&file);
打印!(“{}”,行);
let bytes=count_字节(&file);
println!(“{}”,字节);
让单词=计数单词(&文件);
打印!(“{}”,字);
}
fn计数\u行(文件:&file)->u32{
让mut计数:u32=0;
BufReader::new(file).lines()。用于每个(| f |{
如果f._ok(){
计数+=1;
}
});
计数
}
fn计数\u字节(文件:&file)->u32{
让mut计数:usize=0;
BufReader::new(file).bytes()。用于每个(| f |{
如果f._ok(){
计数+=1;
}
});
算作u32
}
fn计数\u字(文件:&file)->u32{
让mut计数:u32=0;
让mut buf:Vec=Vec::new();
让mut reader=BufReader::new(文件);
而让Ok(u)=reader.read_直到(b'',&mut buf){
计数+=1;
}
计数
}

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

文件
有一个位置“指针”,用于知道下一步读取哪个字节。读取一个字节后,该位置将增加一,因此下一个读取调用将读取下一个字节,而不是相同的字节

您可以在调用
计数行
计数字节
计数字
之间使用更改此位置

使用std::io::{Seek,SeekFrom};
fn main(){
设arg=&std::env::args()
.nth(1)
.expect(“未找到文件操作数”)
.to_owned();
让mut file=file::open(arg).expect(“无法打开文件进行读取”);
let lines=计数行(&file);
打印!(“{}”,行);
seek(SeekFrom::Start(0)).expect(“seek失败”);
let bytes=count_字节(&file);
println!(“{}”,字节);
seek(SeekFrom::Start(0)).expect(“seek失败”);
让单词=计数单词(&文件);
打印!(“{}”,字);
}

为了进一步说明您的代码,我们认为它不太“生锈”。您的手动计数可以通过使用简化

fn计数\u行(文件:&file)->u32{
BufReader::新建(文件).lines().count()作为u32
}
fn计数\u字节(文件:&file)->u32{
BufReader::新建(文件).bytes().count()作为u32
}

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

fn计数\u字(文件:&file)->u32{
让mut计数:u32=0;
让mut buf:Vec=Vec::new();
让mut reader=BufReader::new(文件);
而让Ok(amount)=reader.read_直到(b'',&mut buf){
如果金额==0{
打破
}
计数+=1;
}
计数
}

请注意,这不是真正正确的实现,因为
“hello”
(末尾两个空格)将为您提供
2
,而不是
1
,但这取决于您如何解决。一定要确保一切正常。

老实说,我总是觉得这让人困惑;希望它被命名为FileCursor,这样更清楚。@MatthieuM。您可能是对的,但AFAIK每种语言都是这样工作的(可能是因为linux处理文件的方式)。恐怕这是需要学习的^^