MST

星途 面试题库

面试题:Rust字符串在文件内容替换中的应用

假设有一个大文本文件,文件内容包含一些敏感词汇,需要将这些敏感词汇替换为特定的替代字符串。请用Rust实现一个高效的文件处理程序,能够逐行读取文件,识别并替换敏感词汇,然后将处理后的内容写回原文件或新文件。注意处理文件过大可能导致内存问题。请阐述你的设计思路并写出关键代码。
11.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 逐行读取:使用BufReader逐行读取文件,避免一次性将整个大文件读入内存。
  2. 敏感词匹配:将敏感词汇存储在HashSet中,以提高查找效率。使用replace方法替换每行中的敏感词汇。
  3. 写入文件:使用BufWriter将处理后的内容写入新文件,避免频繁的磁盘I/O操作。如果需要写回原文件,可以先写入临时文件,然后替换原文件。

关键代码

use std::fs::{File, OpenOptions};
use std::io::{BufRead, BufReader, BufWriter, Write};
use std::collections::HashSet;

fn main() {
    let input_file_path = "input.txt";
    let output_file_path = "output.txt";
    let sensitive_words: HashSet<&str> = HashSet::from([
        "敏感词1", "敏感词2", "敏感词3"
    ]);
    let replacement = "替换字符串";

    let input_file = File::open(input_file_path).expect("无法打开输入文件");
    let output_file = OpenOptions::new()
      .write(true)
      .create(true)
      .truncate(true)
      .open(output_file_path)
      .expect("无法创建输出文件");

    let reader = BufReader::new(input_file);
    let mut writer = BufWriter::new(output_file);

    for line in reader.lines() {
        let line = line.expect("读取行失败");
        let new_line = sensitive_words.iter()
          .fold(line, |acc, word| acc.replace(word, replacement));
        writeln!(writer, "{}", new_line).expect("写入行失败");
    }
}

如果要写回原文件,可以在上述代码基础上添加以下步骤:

// 引入文件替换的库
use std::fs::rename;

// 在写入完成后,将临时文件替换原文件
rename(output_file_path, input_file_path).expect("替换文件失败");