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