用关联容器实现文本替换单词

给定一个string。将它转换为还有一个string。程序的输入是两个文件。

第一个文件保存的是一些规则,用来转换第二个文件的文本。

每条规则由两部分组成:一个可能出如今输入文件里的单词和一个用来替换它的短语。表达的含义是,每当第一个单词出如今输入中时,我们就将它替换为相应的短语。第二个输入文件包括要转换的文本。


简单来说,就是把rule文件里的相应单词替换,在target文件里进行实现。

思路:rule文件里有一个单词的简写后面是单词的全写,也就是说在target中找到简写的单词。依据rule中的单词进行替换。明显rule中的单词没有反复的,一个相应一个。这就想到了使用map这个关联矩阵来实现。

代码:

// transform.cpp : 定义控制台应用程序的入口点。
//给定一个string,将它转换为还有一个string。程序的输入是两个文件。

第一个文件保存的是一些 //规则,用来转换第二个文件的文本。每条规则由两部分组成:一个可能出如今输入文件里的单词和 //一个用来替换它的短语。表达的含义是。每当第一个单词出如今输入中时,我们就将它替换为相应 //的短语。

第二个输入文件包括要转换的文本。 #include "stdafx.h" #include <iostream> #include <map> #include <string> #include <fstream> #include <sstream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string rule_path="rule.txt"; string tar_path="target.txt"; string fin_path="final.txt"; ifstream ruleFile(rule_path); ifstream tarFile(tar_path); ofstream finFile; finFile.open(fin_path); string text; map<string, string> mymap; if(ruleFile) { while(getline(ruleFile,text)) { string key, value; int n=text.find_first_of(" "); key=text.substr(0,n); value=text.substr(n+1); //cout<<key<<" "<<value<<endl; mymap.insert(make_pair(key,value)); } } if(tarFile) { while(getline(tarFile,text)) { //显然我须要把每一个单词分开,然后跟rule文件里的key进行比較,把字符串中的单词分开 //istringstream是一个好方法。 istringstream is(text); string s; while(is>>s) { auto map_it=mymap.find(s); if(map_it != mymap.cend()) s=map_it->second; cout<<s<<" "; finFile<<s<<" "; } cout<<endl; finFile<<endl; } } system("pause"); return 0; }

结果:





原文地址:https://www.cnblogs.com/blfbuaa/p/6936685.html