文件打开后还在作用域内,二次使用的时候(注释所在行)为何失效呢?求助大家,感谢^_^
use std::io::{self, BufReader, BufRead};
use std::env;
use std::fs::File;
use flate2::read;
fn main() -> Result<(), io::Error> {
let args: Vec<String> = env::args().collect();
let file = &args[1];
let fp = File::open(&file)?;
let gz_reader = read::GzDecoder::new(&fp);
match gz_reader.header() {
Some(_) => {
println!("gz file");
let reader = BufReader::new(gz_reader);
for each in reader.lines() {
if let Ok(line) = each {
println!("{}",line);
}
}
},
None => {
println!("text file");
//let fp = File::open(file)?; //问题就在这里,为何去掉注释就能正常输出text内文件容,否则结果为空
let reader = BufReader::new(&fp);
for each in reader.lines() {
if let Ok(line) = each {
println!("{}",line);
}
}
}
}
Ok(())
}
1
共 7 条评论, 1 页
评论区
写评论刚试了下,seek之后是可以读到内容的
还是不行
--
👇
Bai-Jinlin: 这个是因为Read,Write对&File实现了,你下面seek一下应该叫没问题了。
--
👇
sharkLoc: 也有想过,打开文件的时候没有mut修饰,而且也只是借用,下意识认为文件指针不会有变动,我再查查资料,谢谢!
--
👇
Grobycn: 大概
gz_reader
读取文件的时候修改了文件的读取位置,需要重新设置成文件开头。这个是因为Read,Write对&File实现了,你下面seek一下应该叫没问题了。
--
👇
sharkLoc: 也有想过,打开文件的时候没有mut修饰,而且也只是借用,下意识认为文件指针不会有变动,我再查查资料,谢谢!
--
👇
Grobycn: 大概
gz_reader
读取文件的时候修改了文件的读取位置,需要重新设置成文件开头。也有想过,打开文件的时候没有mut修饰,而且也只是借用,下意识认为文件指针不会有变动,我再查查资料,谢谢!
--
👇
Grobycn: 大概
gz_reader
读取文件的时候修改了文件的读取位置,需要重新设置成文件开头。内部可变性吧。
io 操作有 side effect 很正常,尤其还要与系统交互。
--
👇
Neutron3529: 问题是
fp
没有mut
啊,在rust的直觉上,这里不应该被修改啊。这是什么神奇的feature吗?
--
👇
Grobycn: 大概
gz_reader
读取文件的时候修改了文件的读取位置,需要重新设置成文件开头。问题是
fp
没有mut
啊,在rust的直觉上,这里不应该被修改啊。这是什么神奇的feature吗?
--
👇
Grobycn: 大概
gz_reader
读取文件的时候修改了文件的读取位置,需要重新设置成文件开头。大概
gz_reader
读取文件的时候修改了文件的读取位置,需要重新设置成文件开头。