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

一个单词转换的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的方法值得学习。

发布了18 篇原创文章 · 获赞 4 · 访问量 8297
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览