问题描述
我在将几个字符串写入我的 .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");
}