【主要摘录C++ Primer第十一章内容】
给定一个string,转换为另一个string。程序的输入是两个文件。第一个文件是一些规则,用来转换第二个文件中的文本。每条规则由两部分组成:一个可能出现在输入文件中的单词和一个用来替换它的短语。表达的含义是,每当第一个单词出现在输入中,我们就将他替换为对应的短语。
单词转换文件的内容如下所示:
brb be right back
k okey?
y why
r are
u you
pic picture
thk thanks!
18r later
希望转换的文本为:
where r u
y dont u send me a pic
k thk 18r
建立转换映射:
map<string, string> buildMap(ifstream &map_file)
{
map<string, string> trans_map;//保存转换规则
string key;//要转换的单词
string value;//替换后的内容
//将第一个单词存入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 &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 << " "; //在单词间打印一个空格
}
//transform返回它的第一个参数或其转换后的形式
cout << transform(word, trans_map); //打印输出
}
cout << endl;
}
}
头文件、主函数及输出结果:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <sstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream file1("in.txt");
ifstream file2("out.txt");
word_transform(file1, file2);
system("pause");
return 0;
}