提问人:JuanN 提问时间:11/14/2023 更新时间:11/14/2023 访问量:42
为什么文件要附加文本而不是替换其内容?
Why the file is appending text instead of replacing its contents?
问:
我有一个文件,另一个里面有其他数据。我已经实现了一个函数来存储 de 其他数据 到文件中:struct
struct
pub struct DataHandler {
pub file: File,
other_data: OtherData,
}
impl DataHandler {
fn write_to_file(&mut self) {
self.file
.write_all(toml::to_string(&self.other_data).unwrap().as_ref())
.unwrap();
}
}
创建 后,文件将打开,并具有读取和写入权限:DataHandler
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(file_path)
.unwrap();
...
let mut handler = DataHandler { file, other_data};
每当调用该函数时,数据都会附加到文件中,尽管在文档中指出:write_to_file
write
如果文件已存在,则对其的任何写入调用都将覆盖其内容
问题是,为什么调用会附加数据?是因为文件从未关闭(因为从未删除)吗?write_all
DataHandler
我尝试存储一个变量而不是内部,并在每次要写入时打开文件,但在我看来效率很低。有什么解决方法吗?Path
File
DataHandler
答:
2赞
cafce25
11/14/2023
#1
这是因为 (或 ) 将写入 的当前位置,该位置在每个 .其他一切都意味着您必须始终一次写入文件的全部内容,这不会非常符合人体工程学。write
write_all
File
write
在想从头开始写作之前,可以先搜索
SeekFrom::Start(0)。
您可能还希望将 File::set_len
添加到您之后写入的字节数,否则您迟早会在写入数据后留下一些剩余的字节。
文档的意思是,它将从开头开始编写而不是附加,但它仍然会推进当前位置。write
评论
1赞
Chayim Friedman
11/14/2023
seek_from(SeekFrom::Start(0))
可以写成 .rewind()
上一个:VSC - 恢复未保存的文件
下一个:共享 Excel 工作表
评论