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

来源:互联网 发布:最好听的网络歌曲推荐 编辑:程序博客网 时间:2024/05/19 23:26

一个单词转换的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

//给定规则文件,建立mapstd::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 0