2017-12-04 18 views
-2

큰 스위치 케이스가 들어있는 파일이 입력되어 있습니다. 사례는 0에서 n까지 증가합니다. 각각의 경우에는 몇 가지 특정 요소 (a, b 등)가 있습니다.텍스트 파일에서 패턴을 추출하기위한 알고리즘/C++ 코드

출력은 모든 고유 요소를 포함하는 벡터, 요소가 사용되는 첫 번째 위치 (대소 문자) 및 마지막으로 요소의 주기성을 포함하는 세 번째 벡터를 포함하는 벡터의 세 가지로 구성됩니다. ,

벡터 1 것 {A, B, C, D}

벡터 2 것 {0

//standard comment useful for parsing file 
switch something 
{ 

case 0: 
    a; 
    b; 
    c; 
    break; 

case 1: 
    break; 

case 2: 
    a; 
    break; 

case 3: 
    d; 
    break; 

case 4: 
    a; 
    d; 
    break; 

} 

출력 :

입력과 같은 텍스트 파일 것 0, 0, 3}

벡터 3은 {2, 0, 0, 1} * 참고 : 0은 비순환 요소 용이고, 2는 요소의 연속 된 두 모양 사이의 경우의 차이입니다. (사례 4 - 사례 2 = 사례 2 - 사례 0 = 2). 이 차이는 자체적으로 을 반복 할 것이므로 두 개의 연속 된 모습을 비교하면됩니다.

또한이 알고리즘은 수십만 줄의 코드를 나타내는 매우 큰 파일에도 적용됩니다. 텍스트 파일의 형식을 고려 는

+0

은 https ://meta.stackoverflow.com/questions/334822 –

+0

일반적으로 아무런 노력도 결과가 없습니다. – user4581301

+0

파일 읽기, 사례 찾기, 요소 찾기, 데이터 구조 작성 및 결과 계산과 같은 몇 가지 문제가 있습니다. 어느 부분에 문제가 있습니까? 문제를 해결하고 단계별로 시도하는 것이 좋습니다. –

답변

1

일치하고이 질문에 당신이 가서 줄을 읽고 구문 분석하는 것이 한 가지 방법을 설명 정확히 방법이다. 나는,하지만 너무 관여하지 않고 그 일을 더 나은 방법이 확신, 여기에 내가있어 무엇 :

샘플 파일
#include <fstream> 
#include <sstream> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::ifstream inputFile("cases.txt"); 

    std::vector<char> uniqueChars; 
    std::vector<int> firstCase; 
    std::vector<int> periodicity; 

    std::string inputLine; 
    while (std::getline(inputFile, inputLine, '\n')) 
    { 
     if (inputLine.compare(0, 5, "case ") == 0) 
     { 
      int caseN = std::stoi(inputLine.substr(5)); 
      while (std::getline(inputFile, inputLine, '\n') && inputLine != " break;") 
      { 
       std::istringstream iss(inputLine); 
       char c, semi; 
       while (iss >> c >> semi) 
       { 
        auto found = std::find(uniqueChars.begin(), uniqueChars.end(), c); 
        if (found == uniqueChars.end()) 
        { 
         uniqueChars.push_back(c); 
         firstCase.push_back(caseN); 
         periodicity.push_back(0); 
        } 
        else 
        { 
         size_t charPos = std::distance(uniqueChars.begin(), found); 
         if (periodicity[charPos] == 0) 
         { 
          periodicity[charPos] = std::abs(caseN - firstCase[charPos]); 
         } 
        } 
       } 
      } 
     } 
    } 

    // print 

    for (auto c : uniqueChars) 
     std::cout << c << " "; 
    std::cout << std::endl; 

    for (auto i : firstCase) 
     std::cout << i << " "; 
    std::cout << std::endl; 

    for (auto p : periodicity) 
     std::cout << p << " "; 
    std::cout << std::endl; 

    return 0; 
} 

출력 :

enter image description here