天天看點

用關聯容器實作文本替換單詞

給定一個string。将它轉換為還有一個string。程式的輸入是兩個檔案。

第一個檔案儲存的是一些規則,用來轉換第二個檔案的文本。

每條規則由兩部分組成:一個可能出如今輸入檔案裡的單詞和一個用來替換它的短語。表達的含義是,每當第一個單詞出如今輸入中時,我們就将它替換為相應的短語。第二個輸入檔案包括要轉換的文本。

用關聯容器實作文本替換單詞

簡單來說,就是把rule檔案裡的相應單詞替換,在target檔案裡進行實作。

思路:rule檔案裡有一個單詞的簡寫後面是單詞的全寫,也就是說在target中找到簡寫的單詞。依據rule中的單詞進行替換。明顯rule中的單詞沒有反複的,一個相應一個。這就想到了使用map這個關聯矩陣來實作。

代碼:

第一個檔案儲存的是一些

//規則,用來轉換第二個檔案的文本。每條規則由兩部分組成:一個可能出如今輸入檔案裡的單詞和

//一個用來替換它的短語。表達的含義是。每當第一個單詞出如今輸入中時,我們就将它替換為相應

//的短語。

第二個輸入檔案包括要轉換的文本。

#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;

結果:

用關聯容器實作文本替換單詞