如何获取文件在 BufReader 中的当前位置?
How can I get the current position in a `BufReader` for a file?
如何在读取多行后获取光标在 rust 中打开的文件流中的当前位置?
例如:
这里我将光标从开始处移动 6 个字节。读到 50 个字符。在此之后我想得到光标的当前位置,并从它的位置再次寻找光标。
use std::fs::File;
use std::io::{BufReader, BufRead, SeekFrom};
use std::io::Seek;
use std::env;
fn main() {
let fafile: String = "temp.fa".to_string();
let mut file = File::open(fafile).expect("Nope!");
let seekto: u64 = 6;
file.seek(SeekFrom::Start(seekto)); //open a file and seek 6 bytes
let reader = BufReader::new(file);
let mut text: String = "".to_string();
//Stop reading after 50 characters
for line in reader.lines(){
let line = line.unwrap();
text.push_str(&line);
if text.len() > 50{
break;
}
}
//How do I get the current position of the cursor? and
// Can I seek again to a new position without reopening the file?
//I have tried below but it doesnt work.
//file.seek(SeekFrom::Current(6));
}
我检查了 seek,它可以将光标从 start
、end
和 current
移动,但没有告诉我当前位置。
关于你的第一个问题,seek
returns移动后的新位置。所以你可以通过从当前偏移量为0来寻找当前位置:
let current_pos = reader.seek (SeekFrom::Current (0)).expect ("Could not get current position!");
(另见 )
关于第二个问题,一旦将 file
变量移动到 BufReader
中,您将无法再访问它,但您可以在 reader 本身上调用 seek:
reader.seek (SeekFrom::Current (6)).expect ("Seek failed!");
正如评论中所指出的,这仅在您没有移动 reader 时才有效,因此您还需要更改阅读循环以借用 reader
而不是移动它:
for line in reader.by_ref().lines() {
// ...
}
如何在读取多行后获取光标在 rust 中打开的文件流中的当前位置?
例如: 这里我将光标从开始处移动 6 个字节。读到 50 个字符。在此之后我想得到光标的当前位置,并从它的位置再次寻找光标。
use std::fs::File;
use std::io::{BufReader, BufRead, SeekFrom};
use std::io::Seek;
use std::env;
fn main() {
let fafile: String = "temp.fa".to_string();
let mut file = File::open(fafile).expect("Nope!");
let seekto: u64 = 6;
file.seek(SeekFrom::Start(seekto)); //open a file and seek 6 bytes
let reader = BufReader::new(file);
let mut text: String = "".to_string();
//Stop reading after 50 characters
for line in reader.lines(){
let line = line.unwrap();
text.push_str(&line);
if text.len() > 50{
break;
}
}
//How do I get the current position of the cursor? and
// Can I seek again to a new position without reopening the file?
//I have tried below but it doesnt work.
//file.seek(SeekFrom::Current(6));
}
我检查了 seek,它可以将光标从 start
、end
和 current
移动,但没有告诉我当前位置。
关于你的第一个问题,seek
returns移动后的新位置。所以你可以通过从当前偏移量为0来寻找当前位置:
let current_pos = reader.seek (SeekFrom::Current (0)).expect ("Could not get current position!");
(另见
关于第二个问题,一旦将 file
变量移动到 BufReader
中,您将无法再访问它,但您可以在 reader 本身上调用 seek:
reader.seek (SeekFrom::Current (6)).expect ("Seek failed!");
正如评论中所指出的,这仅在您没有移动 reader 时才有效,因此您还需要更改阅读循环以借用 reader
而不是移动它:
for line in reader.by_ref().lines() {
// ...
}