Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String 如何删除Rust中文本文件的第一行?_String_File_Rust - Fatal编程技术网

String 如何删除Rust中文本文件的第一行?

String 如何删除Rust中文本文件的第一行?,string,file,rust,String,File,Rust,我有一个/file.txt,即: Lorem ipsum 多洛坐 艾米特 我希望相同的/file.txt为: dolor-sit 艾米特 我不关心这个文件的任何其他方面;我不打算对它做任何进一步的操纵或类似的事情。我只想去掉第一条线 std::fs::write覆盖文件的全部内容。我想我需要将整个文件读入一个字符串,删除字符串开头的所有内容,直到找到新行(不知何故),然后用该新字符串覆盖整个文件。虽然可能只有我一个人,但这一切都有点过分了。我不关心文件的全部内容 我问这个问题的原因是因为我

我有一个
/file.txt
,即:

Lorem ipsum
多洛坐
艾米特
我希望相同的
/file.txt
为:

dolor-sit
艾米特
我不关心这个文件的任何其他方面;我不打算对它做任何进一步的操纵或类似的事情。我只想去掉第一条线


std::fs::write
覆盖文件的全部内容。我想我需要将整个文件读入一个字符串,删除字符串开头的所有内容,直到找到新行(不知何故),然后用该新字符串覆盖整个文件。虽然可能只有我一个人,但这一切都有点过分了。我不关心文件的全部内容

我问这个问题的原因是因为我根本不知道该怎么做,尤其是如果有更好的方法来处理整个事情的话。如果有一个简单明了的答案那就太好了


已针对Rust 1.0进行了回答,该版本已经过时,以至于不再存在
BufReader.lines()

您必须读取除第一行以外的所有内容,然后覆盖文件内容。我会这样做:

使用std::{
fs::文件,
io::{赛尔夫,前奏曲::*},
};
fn删除第一行(路径:&str)->io::结果{
设buf={
让r=文件::打开(路径)?;
让mut reader=io::BufReader::new(r);
reader.read_直到(b'\n',&mut-Vec::new())?;
让mut buf=Vec::new();
读卡器。读到最后(&mut buf)?;
缓冲器
};
文件::创建(路径)?.write_all(&buf)?;
好(())
}
我创建一个
BufReader
来读取第一行,然后返回文件中剩余的内容并再次放入

如果不想再次关闭和打开文件,则必须更改查找位置,以便不向文件追加数据:

使用std::{
fs::OpenOptions,
io::{赛尔夫,前奏曲::*},
};
fn删除第一行(路径:&str)->io::结果{
让file=OpenOptions::new().read(true).write(true).open(path)?;
让mut reader=io::BufReader::new(文件);
reader.read_直到(b'\n',&mut-Vec::new())?;
让mut buf=Vec::new();
读卡器。读到最后(&mut buf)?;
让mut file=reader.into_inner();
seek(io::SeekFrom::Start(0))?;
文件。全部写入(&buf)?;
好(())
}

做了更多的研究,这是我最后得到的最接近的结果

我不知道这是否是最佳的,也不完全确定这是否保留了文件的格式(尽管我认为是这样)。我想可能还有一种更好的加载文件的方法。我不知道很多事情

但它有效吗

use std::{fs, fs::File, fs::OpenOptions};
use std::io::{BufReader, BufRead, Write};

fn main() {
    let mut file = OpenOptions::new()
        .read(true)
        .write(true)
        .open("./file.txt")
        .expect("file.txt doesn't exist or so");

    let mut lines = BufReader::new(file).lines().skip(1)
        .map(|x| x.unwrap())
        .collect::<Vec<String>>().join("\n");

    fs::write("./file.txt", lines).expect("Can't write");
}
使用std:{fs,fs::File,fs::OpenOptions};
使用std::io::{BufReader,BufRead,Write};
fn main(){
让mut file=OpenOptions::new()
.读(真)
.写(真)
.open(“./file.txt”)
.expect(“file.txt不存在或不存在”);
让mut lines=BufReader::new(file).lines()跳过(1)
.map(| x | x.unwrap())
.collect::().join(“\n”);
fs::write(“./file.txt”,行)。expect(“无法写入”);
}

我看不到你发布的代码有任何错误。分享你的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你已经花了时间来帮助自己,它避免了我们重复显而易见的答案,最重要的是它帮助你得到一个更具体和相关的答案。另请参见:@Shepmaster我没有发布任何代码???您的问题可能会由的答案回答。如果没有,请回答您的问题以解释差异。否则,我们可以将这个问题标记为已回答。Shepmaster的第一个评论是一种厚颜无耻的方式,说“你尝试了什么?”为了这个目的将整个文件读入内存似乎很昂贵。不过,我想不出任何其他方法来做到这一点,如果我使用像
std::io::copy
这样的东西,文件将被覆盖,而不是保留全部内容。