c++ primer上的一个例子,输入一个转换映射文件和一个待转换文件,输出转换后结果。用c++的map来实现。
//建立映射函数
map<string, string> buildMap(ifstream &map_file) {
map<string, string> trans_map;//保存转换规则的map
string key; //要转换的单词
string 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 &s,const map<string,string> &m) {
//实际的转换工作
auto map_it = m.find(s);
// 若单词在转换规则map中
if (map_it != m.cend())
return map_it->second; //使用替换短语
else
return s; //否则返回原string
}
// 单词转换函数
void word_transform(ifstream &map_file, ifstream &input)
{
auto trans_map = buildMap(map_file);
string text; //保存输入中的每一行
while (getline(input,text))
{
istringstream stream(text); //读取每一个单词
string word;
bool firstword = true; //控制是否打印空格
while (stream>>word)
{
if (firstword)
firstword = false;
else
{
cout << " "; // 在单词间打印一个空格
}
cout << transform(word, trans_map); //打印输出
}
cout << endl;
}
}
int main()
{
ifstream f("map_file.txt");
ifstream f2("input_file.txt");
word_transform(f, f2);
return 0;
}
映射文件map_file.txt:
brb be right back
k okay?
y why
r are
u you
pic picture
thk thanks!
l8r later
带转换文件input_file.txt:
where r u
y dont u send me a pic
k thk l8r
输出:
where are you
why dont you send me a picture
okay? thanks! later