写入文件前执行读取操作引发异常问题
Rust 文件读写偏移量问题:非空文件回写异常
问题原因
当文件非空时,read_to_string会把文件指针移动到文件末尾。后续调用set_len(0)虽然将文件截断为空,但文件指针的位置不会自动重置到开头。此时执行write操作,会尝试在原文件末尾的偏移位置写入数据,而该位置已超出截断后的文件长度,最终触发异常。
首次运行正常是因为初始文件为空,read_to_string后指针仍停在0位置,后续操作不受影响。
修复方案
在写入操作前(或调用set_len之后),手动将文件指针重置到文件开头即可,需要引入Seek trait:
修复后的代码
use std::{ fs::OpenOptions, io::{Read, Seek, SeekFrom, Write}, // 引入Seek相关 trait 和枚举 }; fn main() { let mut file = OpenOptions::new() .read(true) .write(true) .create(true) .open("todo.txt") .unwrap(); let mut read_task = String::new(); file.read_to_string(&mut read_task) .expect("Issue reading to string"); let write_tasks = "1\n2\n3\n4\n"; file.set_len(0).expect("Issue in setting len to zero"); // 重置文件指针到文件开头 file.seek(SeekFrom::Start(0)).expect("Issue seeking to start"); file.write(write_tasks.as_bytes()).expect("Issue writing to file"); }
额外说明
- 若不需要保留读取到的内容,可直接跳过
read_to_string操作,直接截断并写入,从根源避免指针问题。 - 也可以选择重新打开文件,但重置指针的方式效率更高。
内容的提问来源于stack exchange,提问作者Siddharth Teli
相关产品推荐
相关产品推荐

