2014-02-22 79 views
0

我有這樣文件解析代碼需要注意

I am a student xyz in university"|USA|" in first year. 
I am a student abc in university"|America|" in first year. 
I am a student asd in university"|Italy|" in first year. 

我要解析的文件,從文件,也是XYZ只提取大學名abc,ASD 文件,所以我寫的下面的代碼

#include <fstream> 
#include <string> 
#include <iostream> 
bool ParseLine(const std::string& line, std::string& key, std::string& value); 

class Demo 
{ 
public: 
    typedef struct _Data 
    { 
     std::string university; 
     std::string name; 

    } Data; 

    Data data; 
}; 

int main() 
{ 
    std::ifstream ifs("Ca.txt"); 
    std::string line; 
    std::string key; 
    std::string value; 
    Demo obj; 
    while(!ifs.eof()) 
    { 
     std::getline(ifs, line); 
     if (ParseLine(line, key, value)) 
     { 
      if (0 == key.compare("student")) 
      { 
       obj.data.name = value; 
      } 

      else if (0 == key.compare("university")) 
      { 
       obj.data.content = value; 
      } 
      else 
      { 
       std::cerr<<"Unknow key:" << key << std::endl; 
      } 
     } 
    } 
    return 0; 
} 

bool ParseLine(const std::string& line, std::string& key, std::string& value) 
{ 
    bool flag = false; 

    if (line.find("//") != 0) 
    { 
     size_t pos = line.find("|"); 
     if (pos != std::string::npos) 
     { 
      key = line.substr(0, pos); 
      size_t pos1 = line.find(";"); 
      value = line.substr(pos + 1, pos1); 
      flag = true; 
     } 
    } 

    return flag; 
} 

兩個問題 在提取大學價值我得到的每一件事情,如「美國|」在第一年,」但我想只有美國和名稱邏輯這麼想的工作

請指導

+0

什麼是'obj.data.content'? – 0x499602D2

+0

@ 0x499602D2它應該是obj.data.university對不起我的錯誤 – user3340847

+0

@ 0x499602D2任何解決方案? – user3340847

回答

0

我會嘗試讀取流字爲單位,並檢查相應的名稱和大學:

int main() 
{ 
    std::ifstream ifs("Ca.txt"); 
    std::string line, word; 
    Demo obj; 

    while (std::getline(ifs, line)) 
    { 
     std::istringstream iss(line); 

     while (iss >> word) 
     { 
      if ((word == "student") && iss >> word) 
      { 
       obj.data.name = word; 
      } else if (word.find("university") != std::string::npos) 
      { 
       size_t pos1 = word.find_first_of("|"), 
         pos2 = word.find_last_of("|"); 

       obj.data.university = word.substr(pos1 + 1, pos2 - pos1 - 1); 
      } 
     } 
     std::cout << "Name: "  << obj.data.name << "\n" 
        << "University: " << obj.data.university << std::endl; 
    } 
} 
+0

它會有正確的名稱我的意思是xyz和abc和另一件你寫的word.substr(10);但我認爲我們應該在代碼中找到這個|「,因爲它不會總是有時大於或等於10總是有多少或少於10個。你說 – user3340847

+0

@ user3340847它應該是正確的。給我一秒鐘來測試它 – 0x499602D2

+0

@ user3340847對不起需要這麼長時間,我能夠得到它的工作,我會更新我的答案。 – 0x499602D2