如何解决如何在 rust 1.26 及以后的版本中将多个字符串写入文件而不相互覆盖?
我在将几个字符串写入我的 .txt 文件时遇到问题,而它们又不会相互覆盖
这是一个例子:
for i in 1..100{
fs::write("*PATH*",i.to_string()).expect("Unable to write file");
}
我认为它应该一个接一个地写出每一个单曲,但事实并非如此!它会覆盖,当我打开文档时,它只是最后写入的数字。
我在网上找不到任何东西,因为这种写入文件的方式似乎很新。
解决方法
您可以在进入循环之前打开 File
。通过使用 write!
和 writeln!
宏,您可以进一步简化对文件的写入。这允许您利用 Rust 的 formatting functionality 避免需要显式执行 i.to_string()
。
由于您要执行大量(小)写入,因此还可以考虑将其包装在 BufWriter
中以最大程度地减少执行的系统调用总数。
use std::fs::File;
use std::io::{BufWriter,Write};
fn main() {
let path = "...";
let f = File::create(path).expect("unable to create file");
let mut f = BufWriter::new(f);
for i in 1..100 {
write!(f,"{}",i).expect("unable to write");
}
}
如果文件已经存在,并且您想在每次执行程序时不断追加到它。然后您可以使用 OpenOptions
打开它,并使用 append(true)
专门启用附加模式:
use std::fs::OpenOptions;
use std::io::{BufWriter,Write};
fn main() {
let path = "...";
let f = OpenOptions::new()
.write(true)
.append(true)
.open(path)
.expect("unable to open file");
let mut f = BufWriter::new(f);
for i in 1..100 {
write!(f,i).expect("unable to write");
}
}
,
我在网上找不到任何东西,因为这种写入文件的方式似乎很新。
它不是很新,而是很错误(对于这个用例)。事先打开文件并写入文件,以便它追加,而不是在每个循环中调用 fs::write
,这将在每次迭代时重新打开和关闭文件,这不仅速度慢,而且会导致您的文件被覆盖:>
use std::fs::OpenOptions;
use std::io::prelude::*;
let file = OpenOptions::new()
.write(true)
.open("/path/to/file")
.expect("Could not open file");
for i in 1..100 {
file.write_all(i.to_string().as_bytes()).expect("Unable to write to file");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。