单词转换程序-练习关联型容器

一个单词转换的map

问题简介

功能:给定一个string,将它按照一定规则转换为另一个string
输入
1_rule文件保存转换规则(每条规则由两部分组成:可能在输入文件中出现的单词和一个用来替代的短语)
2_input文件保存待转换的文本
输出:在标准输出中打印转换后的文本

思路分析

1 word_transform函数控制整个转换过程,接受两个参数,一个转换规则,一个带转换的文本
2 buildMap 函数:读入给定文件,建立单词转换映射
3 transform_word 函数:读入需要转换的string的引用和转换规则;如果给定string在map中,则返回转换后的string,否则直接返回原string

编写程序

主程序

string map_path = "/users/tubin/desktop/testForFstream/1_rule.txt";
string input_path = "/users/tubin/desktop/testForFstream/2_input.txt";
ifstream map_file(map_path);
ifstream input(input_path);

try {
    if (!map_file.is_open() || !input.is_open()) {
        throw runtime_error("file cannot open");
    }
    word_transform(map_file, input);    //直接调用转换程序
} catch (runtime_error e) {
    cout << e.what() << endl;
}

word_transform

//读取每一行,对每行中每一个单词进行映射
void word_transform(std::ifstream &map_file, std::ifstream &input) {
    map<string, string> m_rule = build_map(map_file);    //建立rule

    string line;
    while (getline(input, line)) {  //对于每一行
        istringstream iss(line);
        string record;
        bool bFirstWord = true; //控制空格输出

        while (iss >> record) { //对于每一列
            if (bFirstWord) {
                bFirstWord = false;
            } else {
                cout << " ";
            }
            string ss = transform_word(record, m_rule);
            cout << ss;
        }
        cout << endl;
    }
}

build_map

//给定规则文件,建立map
std::map<std::string, std::string> build_map(std::ifstream &map_file) {
    map<string, string> m_rule;
    string key;
    string value;

    //先读第一个string 作为key,再读后面一整行作为value
    while (map_file >> key && getline(map_file, value)) {   
        if (value.size() > 1) {
            m_rule[key] = value.substr(1);  //略过前导空格
        } else {
            throw runtime_error("no rule for " + key);
        }
    }
    return m_rule;
}

transform_word

//根据map,映射单词
const std::string& transform_word(const std::string& s, const std::map<std::string, std::string>& m_rule) {
    auto iter = m_rule.find(s);
    if (iter != m_rule.end()) {
        return iter->second;
//        return m_rule[s]; //注意,只能对非const对象调用[]运算符
    } else {
        return s;
    }
}

小结

虽然题意简单,但还是能够考察基本功。其中istringstream的使用和读取key value的方法值得学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值