为什么在 Rust 中写入文件时会出现“错误的文件描述符”错误?

Joh*_*ohn 6 rust

忽略我unwrap用来忽略文件不存在时会发生什么的事实,在我看来,这段简短的代码应该可以工作(只要文件确实存在):

use std::fs::File;
use std::io::Write;

fn main() {
    let mut f = File::open("test.txt").unwrap();
    let result = f.write_all(b"some data");

    match result {
        Ok(_) => println!("Data written successfully"),
        Err(e) => panic!("Failed to write data: {}", {e}),
    }
}
Run Code Online (Sandbox Code Playgroud)

相反,我得到了这个:

thread 'main' panicked at 'Failed to write data: Bad file descriptor (os error 9)', src/main.rs:10:19
Run Code Online (Sandbox Code Playgroud)

需要明确的是,我知道如果我按照在线的众多示例之一进行操作,我可以写入文件。问题不是“我如何写入文件?”。这就是为什么这不起作用。

Val*_*tin 7

它不起作用,因为File::open()只读模式打开文件。相反,您必须使用File::create()which 在只写模式下打开文件。或者,您也可以使用OpenOptions, 进一步指定是否要改为append()文件。

use std::fs::File;
use std::io::Write;

fn main() {
    let mut f = File::create("test.txt").unwrap();

    let result = f.write_all(b"some data");

    match result {
        Ok(_) => println!("Data written successfully"),
        Err(err) => panic!("Failed to write data: {}", err),
    }
}
Run Code Online (Sandbox Code Playgroud)

使用与以下方式File::create()使用相同OpenOptions

use std::fs::OpenOptions;
use std::io::Write;

fn main() {
    let mut f = OpenOptions::new()
        .write(true)
        .create(true)
        .truncate(true)
        .open("test.txt")
        .unwrap();

    let result = f.write_all(b"some data");

    match result {
        Ok(_) => println!("Data written successfully"),
        Err(err) => panic!("Failed to write data: {}", err),
    }
}
Run Code Online (Sandbox Code Playgroud)