C++Primer第11章 一个单词转换的map【程序】

程序的功能:

从规则文件rule.txt读入转换的规则,生成map<string, string>

从待转换的文件file.txt读取文本,进行单词转换。


main.cpp

#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <sstream>

using namespace std;

//单词转换函数
const string word_transform(ifstream &map_file, ifstream &input);
//读入规则文件,生成对应的map映射
map<string, string> buildMap(ifstream &map_file);
//转换操作
const string &transform(const string &word, const map<string, string> &map);




int main() {
    ifstream file_stream("D:\\Tao\\C_CPP_Projects\\aaC++\\files\\file.txt");   //待转换的文件
    ifstream map_stream("D:\\Tao\\C_CPP_Projects\\aaC++\\files\\rule.txt");    //规则文件
    const string result = word_transform(map_stream, file_stream);
    cout << result;
    return 0;
}



const string word_transform(ifstream &map_file, ifstream &input) {
    string result = "";
    map<string, string> trans_map = buildMap(map_file);
    string text;
    //每次读入一行待转换的文本
    while(getline(input, text))
    {
        stringstream ss(text);
        string word;
        bool first_word = true;
        //每次取这行文本中的一个单词
        while(ss >> word)
        {
            if(first_word)
                first_word = false;
            else
                result += " ";
            //转换每个单词
            result += transform(word, trans_map);
        }
        result += '\n';
    }
    return result;
}



//读入规则文件,生成对应的map映射
map<string, string> buildMap(ifstream &map_file)
{
    map<string, string> trans_map;  //保存转换规则的map
    string key;     //键
    string value;   //值
    string line;
    //读取第一个单词到key,剩下的所有内容读入value
    while(map_file >> key && getline(map_file, value))
    {
        if(value.size() > 1)
        {
            trans_map[key] = value.substr(1);   //跳过前导空格
        }
        else
        {
            throw runtime_error("no rule for " + key);
        }
    }
    return trans_map;
}



//转换操作
const string &transform(const string &word, const map<string, string> &map)
{
    auto map_iter = map.find(word);
    if(map_iter != map.cend())
        return map_iter->second;
    else
        return word;
}






发布了160 篇原创文章 · 获赞 150 · 访问量 60万+
展开阅读全文

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

©️2019 CSDN 皮肤主题: 撸撸猫 设计师: 设计师小姐姐

分享到微信朋友圈

×

扫一扫,手机浏览