2014-01-23 119 views
0

我是C++新手,C++函數的功能如下。 查找文件:C++字符串匹配和替換使用查找文件

POST OFFICE,PO 
SUITE ACCESS ROOM, SAR 
SUITE,STE 
STREET,ST 
NEW YORK,NY 
POST,PST 
LONG LINE STREET,LLS 

會有哪些應該有像「ARIJIT, 192 POST OFFICE, SUITE」一個參數,它會給像「ARIJIT, 192 PO, STE」輸出一個C++函數。它將使用一個靜態查找文件,如上層內容。

我做了下面的代碼結構,但沒有找到在哪個方向去..

#include <iostream> 
#include <fstream> 
#include <string> 
int main() 
{ 
    char * processAddress (char *input); 
    char *input = "ARIJIT, 192 POST OFFICE, SUITE"; 
    char *output = processAddress(input); 
    std::cout << output; 
    return 0; 
} 

char * processAddress (char *input) { 
    char *output = input; 

    std::ifstream file("LookUp.csv"); 
    std::string str; 
    while (std::getline(file, str)) 
    { 
     std:: cout << str << '\n'; 
    } 
    return output; 
} 

問題,我面對

1. How to map look up file 

2. Find and Replace 

在此先感謝。

+0

您必須閱讀文件並從中創建數據結構(地圖)。然後,您必須嘗試在該參數中找到所有關鍵字符串(「POST OFFICE」),然後*然後*您將能夠使用替換。但要注意一個關鍵字符串是另一個關鍵字符串的可能性,如在「STREET」和「LONG LINE STREET」中。按降序排列鍵字符串可能會有所幫助。 – laune

+0

您的第一行沒有顯示您爲解決此問題所做的個人努力。你需要給我們一個例子。你的意見是什麼,你的預期和實際產出是多少?你是如何讀取文件並存儲它的內容的? – poljpocket

回答

1

謝謝夥計

我在下面解決它的代碼。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <map> 
int main() 
{ 
    std::string processAddress (std:: string input); 
    std::string input = "ARIJIT, 192 POST OFFICE, SUITE"; 
    std::string output = processAddress(input); 
    std::cout << output << "\n"; 
    return 0; 
} 

std::string processAddress (std:: string input) { 
    void replaceAll(std::string& str, const std::string& from, const std::string& to); 
    std::ifstream file("LookUp.csv"); 
    std::string str; 
    typedef std::map<std::string, std::string> MyMap; 
    MyMap my_map; 
    while (std::getline(file, str)) 
    { 
     std::string delimiter = ","; 
     std::string token1 = str.substr(0, str.find(delimiter)); 
     std::string token2 = str.substr(token1.length()+1, str.find(delimiter)); 
     my_map[token1] = token2; 
    } 
    // Map Enumeration 
    for(MyMap::const_iterator it = my_map.end(); it != my_map.begin(); --it) 
    { 
     std::string key = it->first; 
     std::string value = it->second; 
     // find and replace 
     replaceAll(input, key, value); 
    } 

    std::string output = input ; 
    return output; 
} 
bool replace(std::string& str, const std::string& from, const std::string& to) { 
    size_t start_pos = str.find(from); 
    if(start_pos == std::string::npos) 
     return false; 
    str.replace(start_pos, from.length(), to); 
    return true; 
} 
void replaceAll(std::string& str, const std::string& from, const std::string& to) { 
    if(from.empty()) 
     return; 
    size_t start_pos = 0; 
    while((start_pos = str.find(from, start_pos)) != std::string::npos) { 
     str.replace(start_pos, from.length(), to); 
     start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' 
    } 
} 
0

假設你已經加載該文件中的字符串,分裂的逗號,並將其存儲在一個可訪問的方式,取代叫你正在尋找的應該是這樣的:

size_t pos = input.find(toReplace); // toReplace = "text to replace" 
if (pos != std::string::npos) { 
    input.replace(pos, toReplace.length(), shorterString); // shorterString = "new text" 
} else { 
    // Your "text to replace" doesn't exist in input 
}