如何获取文件的“ BufReader”中的当前位置?

问题描述 投票:0回答:2

读取几行后如何在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,它可以从startendcurrent中移动光标,但没有告诉我当前位置。

file rust io seek
2个回答
2
投票

关于第一个问题,seek移动后返回新位置。因此,您可以通过从当前位置偏移0来寻找当前位置:

seek

(另请参阅let current_pos = reader.seek (SeekFrom::Current (0)).expect ("Could not get current position!");

关于第二个问题,一旦将this question变量移到file中就不能再访问它了,但是可以在阅读器本身上调用seek。

BufReader

1
投票

由于reader.seek (SeekFrom::Current (6)).expect ("Seek failed!"); 方法返回了新位置,因此可以通过偏移量为0的搜索来获得当前位置:

seek()

还有一种不稳定的方法let current_pos = file.seek(SeekFrom::Current(0))?; stream_position()),它被用作上述代码的方便快捷方式。

© www.soinside.com 2019 - 2024. All rights reserved.