本实例将展示map的创建、搜索以及遍历。map之外还用到IO操作,文件读写,string流等,实现以下功能:
①用一个文件保存一些规则,即一种映射关系,用来转换第二个文件中的文本,每条规则由两部分组成:一个可能出现在输入文件中的单词和一个用来替换它的短语
②用另一个文件来保存需要转换的文本
③将转换后的文本打印在控制台并用一个文件保存
#include <iostream>
#include <sstream>
#include <map>
#include <fstream>
#include <cstdlib>
using namespace std;
//建立转换映射
map<string, string> buildMap(ifstream &map_file)
{
map<string, string> trans_map; //转换规则,map保存的一种映射关系
string key; //要转换的单词
string value; //转换后的内容
//getline函数定义:
//istream &getline(istream &is, string &str, char delim);
//is 进行读入操作的输入流
//str 用来存储读入的内容
//delim 终结符,遇到该字符停止读取操作,默认是回车
//读取第一个单词存入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)
{
map<string, string>::const_iterator map_it = m.find(s);//逐个单词进行检查
if(map_it != m.cend()) //如果单词在转换规则中
{
return map_it->second; //替换单词
}
else
{
return s; //否则,返回原单词
}
}
void word_transform(ifstream &map_file, ifstream &input, ofstream &result)
{
map<string, string> trans_map = buildMap(map_file); //保存转换规则
string text; //保存每一行输入
while(getline(input, text)) //读取每一行输入
{
istringstream stream(text); //读取每个单词
string word;
bool first_word = true; //控制打印格式,是否打印空格
//这个while循环是输出一行
while(stream >> word)
{
if(first_word)
{
first_word = false;
}
else
{
cout << " ";
result << " ";
}
cout << transform(word, trans_map); //以流的形式输出到控制台
result << transform(word, trans_map); //以流的形式写入到文件
}
cout << endl; //到这里完成一行的转换
result << endl;
}
}
int main()
{
//创建文件流对象时,提供一个文件名,则open会被自动调用
ifstream trans_rules("transform_rule.txt");//只读
ifstream input("input.txt");//只读
ofstream result("result.txt");//只写
word_transform(trans_rules, input, result);
//关闭文件
trans_rules.close();
input.close();
result.close();
system("pause");
return 0;
}
效果:
转换规则
待转换文件
转换后的文件
打印输出