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
相关产品推荐
相关产品推荐

