如何将Rust向量内容输出到文本文件并添加自定义域名后缀?
问题描述
我定义了如下Rust向量:
let v = vec!["foo", "bar", "go", "any"];
需要将该向量内容输出到文本文件,且每个元素后添加指定内容(如@gmail.com),最终文件内容期望为:
foo@gmail.com bar@gmail.com go@gmail.com any@gmail.com
我尝试了两段代码,但都没达到预期效果:
初始尝试代码
use std::{fs::File, io::Write}; fn main() -> std::io::Result<()> { let v = vec!["foo", "bar", "go", "any"]; let mut f = File::create("try.txt")?; for item in v { f.write_all(item.as_bytes())?; } Ok(()) }
后续修改代码
use std::{fs::File, io, io::Write}; fn main() -> std::io::Result<()> { let v = vec!["foo", "bar", "go", "any"]; let mut write_domain = String::new(); println!("Enter your domain :"); let _user_domain = io::stdin().read_line(&mut write_domain).unwrap(); let mut f = File::create("try.txt")?; for item in v { let item = format!("{item}@{write_domain}"); f.write_all(item.as_bytes())?; } Ok(()) }
修正方案
你的代码存在两个核心问题:
read_line会把输入末尾的换行符\n也读取到write_domain中,导致最终拼接的字符串包含多余换行;- 写入文件时没有为每个元素添加换行,所有内容会挤在一行。
以下是修正后的代码:
use std::{fs::File, io, io::Write}; fn main() -> std::io::Result<()> { let v = vec!["foo", "bar", "go", "any"]; let mut write_domain = String::new(); println!("Enter your domain :"); // 读取输入并去除末尾的换行符,用?处理错误而非unwrap io::stdin().read_line(&mut write_domain)?; let write_domain = write_domain.trim(); let mut f = File::create("try.txt")?; for item in v { // 拼接字符串并添加换行符,确保每行一个元素 let line = format!("{item}@{write_domain}\n"); f.write_all(line.as_bytes())?; } Ok(()) }
关键说明
- 使用
trim()去除输入域名的首尾空白(包括换行符),避免拼接后出现格式错误; - 格式化字符串时添加
\n,保证每个元素单独占一行; - 替换
unwrap()为?,更符合Rust的错误处理规范,避免程序因输入错误直接崩溃; - 若不需要用户输入域名,直接固定后缀的话,可简化为:
use std::{fs::File, io::Write}; fn main() -> std::io::Result<()> { let v = vec!["foo", "bar", "go", "any"]; let domain = "gmail.com"; let mut f = File::create("try.txt")?; for item in v { let line = format!("{item}@{domain}\n"); f.write_all(line.as_bytes())?; } Ok(()) }
内容的提问来源于stack exchange,提问作者Egor Likhacev
相关产品推荐
相关产品推荐

