You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

写入文件前执行读取操作引发异常问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:52:17