如何修改文件的内容而不是在Rust中的文件前面?

Fal*_*len 3 rust

我以为你只是打开一个文件并寻找你要覆盖的位置并开始写,但似乎它只在该位置添加了字节.如何从文件中删除字节或覆盖字节?

一个例子:

use std::fs::OpenOptions;
use std::io::{prelude::*, Seek, SeekFrom};

fn main() {
    let mut file = OpenOptions::new()
        .read(true)
        .append(true)
        .create(true)
        .open("/tmp/file.db")
        .unwrap();

    let bytes: [u8; 4] = [1, 2, 3, 4];

    file.seek(SeekFrom::Start(0)).unwrap();
    file.write_all(&bytes).unwrap();
}
Run Code Online (Sandbox Code Playgroud)

输出文件之前:

00000000: 0102 0304 0a                             .....
Run Code Online (Sandbox Code Playgroud)

输出文件后:

00000000: 0102 0304 0102 0304 0a                   .........
Run Code Online (Sandbox Code Playgroud)

如您所见,寻求0不会覆盖文件中已有的4个字节.相反,它会将它们预先添加到文件中.

Sim*_*ead 6

因为你正在使用它append(true).从文档:

此选项(如果为true)表示写入将附加到文件而不是覆盖以前的内容.请注意,设置.write(true).append(true)与仅设置具有相同的效果.append(true).

write(true)相反,使用添加写权限:

let mut file = OpenOptions::new()
    .read(true)
    .write(true) // <--------- this
    .create(true)
    .open("/tmp/file.db")
    .unwrap();
Run Code Online (Sandbox Code Playgroud)

..并且您的代码将按预期工作.

  • :(我一开始有`.write(true)`,但在关于`.append()`的文档中看到了同样的一行暗示`.write()`,当然我也想扩展文件,所以我将 `.write()` 替换为 `.append()`。似乎不直观的是,append 应该忽略搜索并暗示写入。但是好吧,把你的观点放在男人中!:P (2认同)