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

Rust中fs::read_to_string变量传参失效,硬编码正常问题求助

Rust输入文件路径无法读取文件的排查与解决

我的项目文件夹下,和src目录同级有若干文本文件。通过run函数获取用户输入并创建ReadFile结构体,使用自定义的println_recieve_h辅助函数获取文件路径后,调用fs::read_to_string读取文件失败,但硬编码路径字符串却能成功读取。已尝试类型转换、克隆等操作,确认输入无拼写错误,怀疑问题出在辅助函数上。

相关代码

pub fn run() {
    loop {
        let file = ReadFile::println_recieve_h("What is the filepath?");
        let query = ReadFile::println_recieve_h("What phrase do you want to find?");
        let readfile = ReadFile::new(&file, &query);
        // ... 省略后续代码
    }
}

fn println_recieve_h(print: &str) -> String {
    println!("{print}");
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    input
}

pub struct ReadFile{ query: String, file_path: String, contents: String }

impl ReadFile {
    fn new(file_path: &String, phrase: &String) -> ReadFile{
        use std::fs;
        ReadFile {  
            query: phrase.clone(), 
            file_path: file_path.clone(), 
            contents: fs::read_to_string(file_path).expect("ERROR 003: FILE NOT FOUND"), 
        }
    }
}

问题原因

问题出在println_recieve_h函数中的read_line方法——它会将用户输入末尾的**换行符(\n)**也包含在返回的字符串里。比如你输入test.txt,实际得到的字符串是test.txt\n,用这个带换行的路径去读取文件,系统找不到对应的文件;而硬编码的路径没有多余的换行符,所以能正常读取。

解决方案

在返回输入字符串前,调用字符串方法去掉多余的换行符:

方法一:去掉首尾所有空白字符

修改println_recieve_h函数,在返回前调用trim()并转为String:

fn println_recieve_h(print: &str) -> String {
    println!("{print}");
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    input.trim().to_string()
}

方法二:仅去掉结尾的换行符

如果担心路径首尾有合法空格(虽然文件路径一般不会有),可以用trim_end()只移除结尾的空白字符:

fn println_recieve_h(print: &str) -> String {
    println!("{print}");
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).unwrap();
    input.trim_end().to_string()
}

内容的提问来源于stack exchange,提问作者Wisp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:01:00